Sed
sed:linux三剑客之一,sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作。
其中,sed的替换功能应用极为广泛,下面主要先介绍下它的替换功能。
取IP地址的例子:过滤功能
ifconfig eth0|sed -n '2p'|sed -nr 's#^.*addr:([0-9].*) B.*#1#gp'
结果:ip地址
sed替换功能举例如下:
[root@xhsj_ClouderaManager test]# cat test.txt
oldboy
oldboy
把oldboy替换成oldgirl:
sed -i 's/oldboy/oldgirl/' test.txt
结果:
cat test.txt
oldgirl
oldgirl
s:表示查找并替换。
find与sed结合以及例子
把/data/目录下所有含有test文件的里面的内容里的oldboy换成oldgirl: find与sed结合
[root@saltstack-client1 data]# pwd
/data
[root@saltstack-client1 data]# ls
a b c d e test tomcat
法一:
[root@saltstack-client1 data]# find /data/ -type f -name "test.txt" |xargs sed -i 's#oldboy#oldgirl#g'
法二:
[root@saltstack-client1 data]# find /data/ -type f -name "test.txt" -exec sed -i 's#oldboy#oldgirl#g' {} ;
Sed命令实战复习回顾
打印
例子:
[root@saltstack-client1 data]# cat oldboy.txt
ddd fff
2ddd fff
3ddd fff
打印第二行内容:
[root@saltstack-client1 data]# sed -n '2p' oldboy.txt
2ddd fff
打印第一行到第二行的内容:
[root@saltstack-client1 data]# sed -n '1,2p' oldboy.txt
ddd fff
2ddd fff
替换
把文件里内容里的所有的ddd换成oldboy:
[root@saltstack-client1 data]# sed -i 's#ddd#oldboy#g' oldboy.txt
[root@saltstack-client1 data]# cat oldboy.txt
oldboy fff
2oldboy fff
3oldboy fff
Sed的后项引用
Sed的后项引用:
后向引用的例子:
取出ip地址的例子:sed
[root@saltstack-client2 test]# ifconfig
eth2 Link encap:Ethernet HWaddr 52:54:00:55:D7:6D
inet addr:10.122.129.55 Bcast:10.122.129.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2876420 errors:0 dropped:0 overruns:0 frame:0
TX packets:265070 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:693181412 (661.0 MiB) TX bytes:24669346 (23.5 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:84802 errors:0 dropped:0 overruns:0 frame:0
TX packets:84802 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4240622 (4.0 MiB) TX bytes:4240622 (4.0 MiB)
法一:sed
[root@saltstack-client2 test]# ifconfig eth2|sed -n 's#^.*dr:([0-9].*) Bcast.*$#1#gp'
10.122.129.55
法二:sed
[root@saltstack-client2 test]# ifconfig|sed -n '2p'|sed -n 's#^.*dr:([0-9].*) Bcast.*$#1#gp'
10.122.129.55
法三:自己搞的
[root@saltstack-client1 ~]# ifconfig eth2
eth2 Link encap:Ethernet HWaddr 52:54:00:3C:DD:D5
inet addr:10.122.129.54 Bcast:10.122.129.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3775521 errors:0 dropped:0 overruns:0 frame:0
TX packets:418876 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:881222306 (840.3 MiB) TX bytes:38853944 (37.0 MiB)
[root@saltstack-client1 ~]# ifconfig eth2|sed -n 's#^.* addr:([0-9].*) Bca.*$#1#gp'
10.122.129.54
Sed与正则表达式相关以及相关的例子
sed -r 's#(可以用正则匹配)#1#g' oldboy.txt
r:表示小括号里一些特殊字符不需要反斜线转义了,而是使用正则。
例子:
[root@saltstack-client1 data]# cat oldboy.txt
oldboy fff
2oldboy fff
3oldboy fff
[root@saltstack-client1 data]# sed -r 's#(.*)ff#1#g' oldboy.txt
oldboy f
2oldboy f
3oldboy f
[root@saltstack-client1 data]# sed -r 's#(.*)f#1#g' oldboy.txt
oldboy ff
2oldboy ff
3oldboy ff
[root@saltstack-client1 data]# sed -r 's#(.*) (.*)#1 2#g' oldboy.txt
oldboy fff
2oldboy fff
3oldboy fff
[root@saltstack-client1 data]# sed -r 's#(.*)#1#g' oldboy.txt
oldboy fff
2oldboy fff
3oldboy fff