sed使用小结
2017/9/6
sed博大精深,本文仅持续更新在工作中频繁使用的方法。
【SED】 ```删除注释#和空行: sed '/ *#/d; /^ *$/d' ```统计行数: sed -n '$=' log/query.log 2546 ```删掉空格: sed 's/\ //g' ```删掉]: sed 's/]//g' ```匹配行前(i,后a)增加一行: sed -i '/-A INPUT -j REJECT --reject-with icmp-host-prohibited/i\-A INPUT -p tcp -m state --state NEW -m tcp --dport 10050 -j ACCEPT' rc.firewall.txt sed -i '/-A INPUT -p icmp -j ACCEPT /a\-A INPUT -p vrrp -j ACCEPT' rc.firewall.txt OK,现在我们要增加N行,怎么处理呢? -------------------------- 【实例1:调整防火墙,增加NFS相关的端口】 [root@test ~]# sed -i.backup '/-A INPUT -i lo -j ACCEPT/a\## NFS related \ -A INPUT -p tcp -m state --state NEW -m tcp --dport 111 -j ACCEPT \ -A INPUT -p udp -m state --state NEW -m udp --dport 111 -j ACCEPT \ -A INPUT -p tcp -m state --state NEW -m tcp --dport 662 -j ACCEPT \ -A INPUT -p udp -m state --state NEW -m udp --dport 662 -j ACCEPT \ -A INPUT -p tcp -m state --state NEW -m tcp --dport 875 -j ACCEPT \ -A INPUT -p udp -m state --state NEW -m udp --dport 875 -j ACCEPT \ -A INPUT -p tcp -m state --state NEW -m tcp --dport 892 -j ACCEPT \ -A INPUT -p udp -m state --state NEW -m udp --dport 892 -j ACCEPT \ -A INPUT -p tcp -m state --state NEW -m tcp --dport 2049 -j ACCEPT \ -A INPUT -p udp -m state --state NEW -m udp --dport 32769 -j ACCEPT \ -A INPUT -p tcp -m state --state NEW -m tcp --dport 32803 -j ACCEPT \ # \ ' /etc/sysconfig/iptables [root@test ~]# service iptables reload -------------------------- 【实例2:调整ntp,增加服务器列表】 先更新一次: # /usr/sbin/ntpdate stdtime.gov.hk # sed -i.backup '/server 0.centos.pool.ntp.org iburst/i\## NTP related \ server stdtime.gov.hk iburst \ server 0.asia.pool.ntp.org iburst \ server 1.asia.pool.ntp.org iburst \ server 2.asia.pool.ntp.org iburst \ \ ' /etc/ntp.conf 启动ntpd服务: # service ntpd start # chkconfig ntpd on -------------------------- ```删掉指定字符 sed 's/insert ignore//g' 1.txt |sed 's/insert//g' |sed 's/\ //g' |sort |uniq -c |sort -nr |more ```正则匹配截取指定字符(例如,截取“down”) echo '<state>down</state>' |sed -nr 's/<state>(.*)<\/state>/\1/p' |sed 's/\ //g' ```截取内容,根据时间段: sed -n '/2013:14:00:00/,/2013:14:40:00/p' 0305.log > 1400.1440.log zcat 2014-06-17-0000-2330_msg.ecqun.com.cn.log.gz |sed -n '/2014:08:00:00/,/2014:10:00:00/p' |more ```替换: sed '/^SELINUX=/c\SELINUX=disabled' /etc/sysconfig/selinux echo "http://192.168.0.154:10010/?from=PEK&to=SHA&date=2013-12-02&enddate=2013-12-02&type=text" | sed -r "s/([0-9]{4}-[0-9]{2}-[0-9]{2})/$(date +%F)/g" echo "20140625232336" |sed -r 's/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/\1-\2-\3 \4:\5:\6/' 2014-06-25 23:23:36 ```替换指定行的内容: sed '15s/abc/def/' ```打印指定行: sed -n '2p' 1630.1650.log_7_1 ```删掉指定行: sed 1,8d WAN.IP ```两行变一行: sed 'N;s/\n//g' 三行变一行: sed 'N;N;s/\n//g' 注意,下列用法和上面的区别: sed ':a;N;s/\n//;ta' sed ':a;...;ta'的作用: :a表示:建立一个标签a;ta表示:如果执行成功,则跳转到标签a处继续执行 t label If a s/// has done a successful substitution since the last input line was read and since the last t or T command, then branch to label; if label is omitted, branch to end of script. 补充一下,得是前面的s///替换语句执行成功了,才跳转到标签 ```替换内容并备份文件 # cd /etc/yum/pluginconf.d/ # sed -i.backup 's/^enabled=1/enabled=0/' fastestmirror.conf # ls fastestmirror.conf fastestmirror.conf.backup security.conf # diff fastestmirror.conf fastestmirror.conf.backup 2c2 < enabled=0 --- > enabled=1 ```说明 “p” command prints the buffer (remember to use -n option with “p”) “d” command is just opposite, its for deletion. ‘d’ will delete the pattern space buffer and immediately starts the next cycle. P:Print up to the first embedded newline of the current pattern space. D:If pattern space contains no newline, start a normal new cycle as if the d command was issued. Otherwise, delete text in the pattern space up to the first newline, and restart cycle with the resultant pattern space, without reading a new line of input. N:Add a newline to the pattern space, then append the next line of input to the pattern space. If there is no more input then sed exits without processing any more commands. 增加一个换行符,并读入下一行,一起保存到 pattern space 中来处理。(回头再去理解下三行变一行,也就是读取第1行时,同时读取了2,3行,一起给后边的s来替换处理,处理过的这几行后续就跳过了。) ```在输出时,增加一行内容的示例: 1)在第1行前插入一段字符 ~]# ls |sed 'N;2iFILENAME' FILENAME set_color.sh t.sh www xxx yyy zzz 2)在每2行前插入一段字符 ~]# ls |sed 'N;iFILENAME' FILENAME set_color.sh t.sh FILENAME www xxx FILENAME yyy zzz 注:上述例子中,结合 'N;' 带来的用法比较特别,不妨仔细琢磨下。 3)在每1行前插入一段字符 ~]# ls |sed 'iFILENAME' FILENAME set_color.sh FILENAME t.sh FILENAME www FILENAME xxx FILENAME yyy FILENAME zzz 4)在第3行前插入一段字符 ~]# ls |sed '3iFILENAME' set_color.sh t.sh FILENAME www xxx yyy zzz