免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sunnylocus
打印 上一主题 下一主题

简单的问题,请高手看下 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2009-06-30 22:27 |只看该作者
发到shell版,那里高手如云。
直到你满意为止。

论坛徽章:
0
52 [报告]
发表于 2009-06-30 23:24 |只看该作者
给你一个我的shell, 能够读懂, 你就简单修改一下就行了.

一  需求:
   想从一文件 Apace 的 apache.conf 文件中, 取出每一段 <VirtualHost 195.200.97.123>  到  </VirtualHost> 之间的内容, 并且以 ServerName 中的域名, 作为相应配置文件的文件名.


二 文件示例: apace.conf

dd
dd
<VirtualHost 195.200.97.123>
    ServerAdmin webmaster@ecritel.net
    ServerName a.com
    ServerAlias www.josealvarez.com
    RewriteEngine On
    RewriteRule ^(.*)$ http://www.josealvarez.fr$1
</VirtualHost>
<VirtualHost 2.2.2.2>
    ServerAdmin webmaster@ecritel.net
    ServerName b.com
    ServerAlias www.josealvarez.com
    RewriteEngine On
    test
    if linux shell
    RewriteRule ^(.*)$ http://www.josealvarez.fr$1
</VirtualHost>
afdas
sdfasdf

三  shell

  实现技巧:
  1.  首先用 if 来判断读取的行,是否以 <Vi开头, 如果不是,继续读下一行, 如果是则开始建立文件.
  2.  建立文件后,继续读下面的行,判断是否 </Vi, 不如不是,写到同一文件中, 如果是, 则表示这一段内容结束. 并取得该段内容里的 ServerName 作为文件名.




#!/bin/sh
dir=`pwd`
mkdir $dir/new
# set -x

#shell 程序用法 ./brek <filename> 会自动获得用户输入的文件名.

# t 是用于计数的, 统计从文件中,可以获取到 <>  </> 之间的个数,用于临时文件名.
t=0

#n 是用于从 <>  到 </> 之间的内容中,无 ServerName 的文件名. 从 0开始计算.
n=0

while read c1
do
if  echo "$c1" |  grep "<Vi" ;then
     t=`expr $t + 1`
     echo $c1 >>$dir/new/$t.txt   
while :
   do
     read c2
     if echo $c2 | grep "</";then
       echo $c2 >>$dir/new/$t.txt
       name=`cat $dir/new/$t.txt  | grep ServerName | awk '{printf $2}'`
         if [ $name != "" ]; then
            mv $dir/new/$t.txt $dir/new/$name.txt
         else
            n=`expr $n + 1`
            mv $dir/new/$t.txt $dir/new/$n.txt
         fi
         
        break 1
     else
       echo $c2 >> $dir/new/$t.txt
    fi
  done  
fi
done < $1

论坛徽章:
0
53 [报告]
发表于 2009-07-01 00:07 |只看该作者
  1. tail -f logfile |awk '$1=="<pos>"{T=1;v=""}T{v=v"\n"$0}$1=="</pos>"{T=0;if (v~/<msid>15953913359/) print v}'
复制代码

论坛徽章:
0
54 [报告]
发表于 2009-07-01 09:08 |只看该作者

回复 #53 ywlscpl 的帖子

不知道那个地方出问题了,什么结果也抓不到。

论坛徽章:
0
55 [报告]
发表于 2009-07-01 09:11 |只看该作者

回复 #52 铁钉 的帖子

多谢,我研究下:wink:

论坛徽章:
0
56 [报告]
发表于 2009-07-01 09:15 |只看该作者

回复 #54 sunnylocus 的帖子

我这里测试没问题
cat add
  1. #!/bin/bash
  2. while :
  3. do
  4. sleep 1
  5. echo "oooooooo" >>logfile
  6. sleep 1
  7. echo "<pos>
  8. <msid>15953913359</msid>
  9. </pos>">>logfile

  10. sleep 1
  11. echo "oooooooo" >>logfile
  12. sleep 1
  13. echo "<pos>
  14. <msid>11111111111</msid>
  15. </pos>">>logfile
  16. done
复制代码

  1. [root@Mylinux tmp]# ./add &
  2. [root@Mylinux tmp]# tail -f logfile |awk '$1=="<pos>"{T=1;v=""}T{v=v"\n"$0}$1=="
  3. </pos>"{T=0;if (v~/<msid>15953913359/) print v}'

  4. <pos>
  5. <msid>15953913359</msid>
  6. </pos>

  7. <pos>
  8. <msid>15953913359</msid>
  9. </pos>
复制代码

论坛徽章:
0
57 [报告]
发表于 2009-07-01 09:55 |只看该作者

回复 #56 ywlscpl 的帖子

我仔细检查了下没有语法错误。我按照大哥您的作法,这么做的
[root@mas tmp]# ./lbs.log &
提示:没有权限。我用chmod 777 lbs.log赋最大权限
再执行./lbs.log &
提示:[root@mas tmp]# -bash: ./lbs.log: 文本文件忙

然后用您写的语句执行,回车后光标一直在原地等待,定位结果回来了也没有输出

是因为这个lbs.log的信息一直在增长,没法判断文件结尾原因造成的吧?感觉象是陷入了死循环


[ 本帖最后由 sunnylocus 于 2009-7-1 09:58 编辑 ]

论坛徽章:
0
58 [报告]
发表于 2009-07-01 10:28 |只看该作者

回复 #57 sunnylocus 的帖子

lbs.log 是啥东西啊? 如果是日志文件怎么可以执行呢?

我给你举的实例中,写了个脚本add放到后台执行模拟logfile文件的不断增长
然后用
  1. tail -f logfile |awk '$1=="<pos>"{T=1;v=""}T{v=v"\n"$0}$1=="</pos>"{T=0;if (v~/<msid>15953913359/) print v}'
复制代码

就可以实时过滤logfile文件中所需信息了

你再检查检查吧

[ 本帖最后由 ywlscpl 于 2009-7-1 10:30 编辑 ]

论坛徽章:
0
59 [报告]
发表于 2009-07-01 10:42 |只看该作者

回复 #58 ywlscpl 的帖子

呵呵,好的。

论坛徽章:
0
60 [报告]
发表于 2009-07-01 10:43 |只看该作者
学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP