与grep不同的是,当使用sed匹配字符串的时候如下:
#sed -n ‘//‘p file // 内填写需要匹配的字符串 例如: #sed -n ‘/root/’p /etc/passwd :匹配包含字符串root的行!(使用grep 匹配则是#grep ‘root’ /etc/passwd)
[[email protected] sed]# grep 'root' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] sed]# sed -n '/root/'p passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
和grep一样也可使用特殊字符匹配:
# sed -n ‘/r.t/’p passwd
# sed -n ‘/r*t/’p passwd
# sed -nr ‘/o+t/’p passwd = #sed -n ‘/o\+t/’ passwd -r:脱意的意思,类似于\
# sed -nr ‘/o{2}/’p passwd //匹配两次o
# sed -nr ‘/root|login/’p passwd //匹配root或login的行
总之一句话,想少用\ 那你就用-r
sed打印指定的行(注意:sed -n 一般都是和p一起用):
#sed -n ‘2’p passwd //打印第二行
#sed -n ‘2,5’p passwd //打印第二行到第五行
#sed -n ‘5,$‘p passwd //打印第五行到最后一行
#sed -n ‘1,$’p passwd //打印全部的行
#sed -e ‘2,5’p -e ‘/root/’p -n passwd //打印第二行到第五行以及包含root的行 -e :多点编辑 //在一个表达式中执行多个动作!
# sed -n ‘/nologin/’Ip passwd I:大写的i 代表着不区分大小写
sed删除指定的行:
案例分析:
假如有个日志文件,很大将近50G,如果使用vim打开进行删除,这样不仅浪费我们的硬件资源,而且还需要等待很长的时间,怎么能不打开就直接删除老的内容呢?
首先使用grep查找指定日期的行(#grep -n ‘关键字’ logfile)。
然后删除之后的所有行:
#sed -i ‘5000,$’d logfile i:修改内容 d:删除动作 //删除5000行到末尾的行
#sed -i ‘/user2/’d logfile //删除user2这个关键字的行
sed替换功能:
#sed ‘1,20s/root/toor/g’ passwd
#sed -r ‘1,10s/ro+/r/g’ passwd //因为表达式中有 + 所以必须要使用 -r 去脱意
把如下字符串,以:为分割点进行第一个和最后一个调换位置:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] sed]# head passwd | sed -r 's#([^:]+):(.*):([^:]+)#\3:\2:\1#g'
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
#sed ‘s#sbin/nologin#123#g’ passwd = #sed -r ‘s/\/sbin\/login/123/g’ passwd //脱意一下
#sed ‘s/[a-zA-Z]//g’ passwd //删除passwd中所有的英文字符(替换成空即为删除)
#head passwd | sed -r ‘s/(.*)/aaa:&/g’ //在前十行每行的前面添加 aaa:
##反复练习,方可熟能生巧##