免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3339 | 回复: 8
打印 上一主题 下一主题

如果用grep命令准确的提取出nginx.conf中虚拟主机的信息? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-04 15:58 |只看该作者 |倒序浏览
本帖最后由 dowson521 于 2011-09-04 16:27 编辑

请教各位 问题RT
试了半天了 不知道如何能准确提取出来
先谢谢各位了
我随便截取一个配置文件 就是以“一个空格+server{ ”开头 然后以最后一个“}”结束

中间这一段 怎么提取啊?
PS:主要是由于要收集所有NGINX服务器的虚拟主机设置,然后入库
如果有其他的方法的话 也好 不一定非要用grep 因为大括号的数量是不确定的
所以我想不到其他什么方法了
请教各位大大

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
2 [报告]
发表于 2011-09-04 16:19 |只看该作者
nginx.conf的内容贴出来看看,说清楚你要提取哪部分

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:55:28
3 [报告]
发表于 2011-09-04 17:48 |只看该作者
写了个笨方法:

  1. #!/bin/bash
  2. >vhost.conf
  3. i=0
  4. while read line;do
  5.     if [ "`echo $line|grep 'server {'`" != "" ]
  6.     then
  7.         ((i++))
  8.         echo $line>>vhost.conf
  9.         continue
  10.     fi
  11.     if [ $i -gt 0 ];then
  12.         echo $line>>vhost.conf
  13.        if [ "`echo $line|grep '{'`" != "" ];then
  14.            ((i++))
  15.        fi
  16.        if [ "`echo $line|grep '}'`" != "" ];then
  17.            ((i--))
  18.        fi
  19.     fi
  20. done < nginx.conf
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-09-04 18:08 |只看该作者
本帖最后由 j3kljs02398j 于 2011-09-05 13:09 编辑

只用grep基本做不到,因为grep是基于行处理的。要提取内容是 server { ...{} ... }标记的。所以想到用的是sed和awk。
第一种: 直接命令调用
  1. sed '1,/^ server {$/d' filename | awk -v count=1 '{\
  2.                 if ($NF == "{")
  3.                         count++
  4.                 if        ($1 == "}")
  5.                         count--
  6.                 if  (count == 0)
  7.                         exit 0
  8.                 print $0
  9.         }' > result
复制代码
第二种: 放在shell脚本中执行(便于批处理)
  1. #! /bin/sh

  2. #用法
  3. #get_conf filename[s]


  4. umask 022
  5. while [ "$1" != "" ];
  6. do
  7.         sed '1,/^ server {$/d' $1 | awk -v count=1 '{\
  8.                 if ($NF == "{")
  9.                         count++
  10.                 if        ($1 == "}")
  11.                         count--
  12.                 if  (count == 0)
  13.                         exit 0
  14.                 print $0
  15.         }'
  16.         shift
  17. done
复制代码
注意:
两种方法中,对于配置文件的格式要求很严格,"{"前一定要有空格且作为本行的末尾,“}"独自一行。否则出错!

论坛徽章:
0
5 [报告]
发表于 2011-09-04 18:16 |只看该作者
脚本的思路:
1.先用sed删除开头行到 “server {”行的内容
2.处理配置信息
   最主要的是找到配置信息的结束标志 "}", 因为配置信息里有多个"{","}",所以用到栈的思想,这里简单计数解决,学过编程的都会的。

论坛徽章:
0
6 [报告]
发表于 2011-09-04 19:37 |只看该作者
楼上高见!!!

论坛徽章:
0
7 [报告]
发表于 2011-09-05 11:29 |只看该作者
脚本的思路:
1.先用sed删除开头行到 “server {”行的内容
2.处理配置信息
   最主要的是找到配置信息的 ...
j3kljs02398j 发表于 2011-09-04 18:16



    如果里面有句这样的东西:
var="fjiemf}"

会不会有问题?

论坛徽章:
0
8 [报告]
发表于 2011-09-05 13:08 |只看该作者
如果里面有句这样的东西:
var="fjiemf}"

会不会有问题?
mpstat 发表于 2011-09-05 11:29

这个不会有问题,因为"fjiemf}" 是ar的值,不是作为边界。
如果这么写: var="fjiemf" }就不行。作为一段结束的 "}" 一定要单行,因为awk读$1来进行判断。

论坛徽章:
0
9 [报告]
发表于 2011-09-06 12:10 |只看该作者
谢谢大家的回复
我这里也有一个办法

是一个同事做的

awk '/^(.*)server {/,/}\\n}/' /usr/local/nginx/conf/nginx.conf

我试了一下 也可以的 最后要多以个 "}"
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP