注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

勇敢的劳尤条

 
 
 

日志

 
 

sed精确匹配问题(awk、tr、grep)  

2013-09-02 17:04:14|  分类: unix/linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
问题来源:
我要修改一个文本文件,用sed进行查找匹配,并将对应那一行的的内容修改成我需要的。
1)当我进行匹配的时候,比如匹配inet,那么inet6这一行也匹配到了,这不是我想要的,于是我只能使用精确匹配的方法。
sed -n "/\<inet\>/p" a     其中,a是文件名,用<inet>精确匹配,反斜杠是转义。
2)当我发现,还是有多行匹配的时候,那么我需要用多个单词同时进行匹配
sed -n "/\<addr\>/{/\<Link\>/p}" a     其中,精确匹配了addr和Link这两个单词
扩展:awk '/xx/&&/yy/{ print $0 }‘   grep -E '(xx.*yy|yy.*xx)'   
        或匹配:sed -n '/\(xx\|yy\)/p'    awk '/xx/||/yy/{ print $0 }'     grep -E '(xx|yy)'
3)但是这样还是没能满足我想要的。因为我需要将匹配的那一行删掉,然后用其他内容那个替换上。
后来想到,可以先将匹配到的行保存在某个变量中,然后进行第二次操作
str=$(sed -n "/\<addr\>/{/\<Link\>/p}" a) 或者 str=`sed -n "/\<addr\>/{/\<Link\>/p}" a)`  这两个命令都可以把命令输出赋值到变量中。
但是,如果真的要先保存到某个变量中,那么其实grep的查找功能更加方便,因为grep直接支持字符串查找
4)现在可以进行自己想要的操作了,将那一行的东西全部替换成其他东西。
可是,还没结束。
当我进行这样的操作的时候,发现出了问题。原因是str中包含特殊字符,没有加上转义字符是不行的,于是这里还需要一个操作。
5)最后,还有一个问题。
举例:

这个是我做测试的a文件

eth0

eth0p
1eth0p
#eth0p
#eth0
^eth0

当我执行这个命令的时候,sed -n '/\<eth0\>/p' a,我期望的输出是精确匹配eth0
但是,结果却是

eth0
#eth0
^eth0

这大大出乎我的意料。于是我考虑,其实精确匹配还要考虑特殊字符的问题。比如说shell和许多配置文件的注释都是以#号开头的,所以,删除注释也是十分重要的。下面的命令用于删除注释。
sed 's/#.*$//g'|sed '/^$/d'
注意#不一定出现在行首。 因此 /#.*$/ 表示 #和后面的数据直到行尾,即一行注释,将他们替换成空
/^$/ 表示空行,后接d 表示删除空行。注意删除空行不能用替换方法,因为空行替换成空后,还是有换行符在那一行。


6)最后,用一个例子来结束这篇博客吧。(这里是要自动修改ip)

#!/bin/sh
IP=`ifconfig ppp0|grep inet|tr ':' ' '|awk '{print $3}'` #获取ip,方式很多,要根据自己的网卡情况
PORT=3478 #端口号
FILE=/etc/restund.conf #修改的文件,restund服务器
#echo $IP:$PORT
str="udp_listen tcp_listen" #两个修改ip+端口的地方
for loop in $str
do
# sstr=$(sed -n "/\<$loop\>/p" $FILE) #可以获得修改行,但是注释行也进来了
sstr=$(cat $FILE|grep -w $loop|grep -v "#") #|awk '{print $2}' #所以用grep获取修改行相当方便
#echo $sstr
sed -i "s/$sstr/$loop $IP:$PORT/g" $FILE #进行替换,ip和端口
done
str="turn_relay_addr" #这里要修改的ip而已。与上面一样
for loop in $str
do
sstr=$(cat $FILE|grep -w $loop|grep -v "#") #|awk '{print $2}'
echo $sstr
sed -i "s/$sstr/$loop $IP/g" $FILE
done




经过上面几个步骤,感觉好麻烦好痛苦呀~
顺便讲讲awk、tr和grep吧。
tr和sed差不多,也是主要做替换工作,但是简单的替换tr速度可快多了。sed和tr的基本操作一般针对行。
awk比起sed功能更强大了,但是awk针对的是指定浏览规则和抽取域信息的,可以看情况是否需要。同时需要注意的是,awk一般是将操作过后的中间文件加以保存,最后再移动到目标~
grep就更不用说了,查找呗,可以查找字符串和正则表达式。

  评论这张
 
阅读(1592)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017