sed

发布时间 2023-08-16 17:58:29作者: Candy独角兽

1. sed 脚本语言

  • sed即Stream EDitor,sed自己的脚本语言,与vi不同,sed是编辑器
[root@localhost ~]#sed --help
用法: sed [选项]... {sed自己的脚本} [输入文件]...

[root@localhost ~]#xargs    #ctrl+D传参并退出
lll      
lll

[root@localhost ~]#xargs echo  #ctrl+D传参并退出
lll
lll

[root@localhost ~]#seq 10
1
2
3
4
5
6
7
8
9
10

[root@localhost ~]#seq 10 | xargs   
1 2 3 4 5 6 7 8 9 10
[root@localhost ~]#seq 10 | xargs -n1  #-n1一次传一个
1
2
3
4
5
6
7
8
9
10

脚本 '地址' + '命令' 组成 
脚本 '命令'  #没有地址就是全文
常用选项
-n:关闭自动打印
-r:使用扩展正则表达式
脚本命令
p:打印
q:退出
d:删除
a:在前面插入内容
i:在后面插入内容
c:替换内容

w file:保存匹配行到指定文件
r file:读取指定文件的文本至模式空间中匹配的行后
=:匹配行取反
!:打印行号
[root@localhost ~]#ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.8.100  netmask 255.255.255.0  broadcast 192.168.8.255
        inet6 fe80::dc8b:de58:8fff:ce65  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:76:f0:1a  txqueuelen 1000  (Ethernet)
        RX packets 176821  bytes 251371933 (239.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 20938  bytes 1305045 (1.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost ~]#ifconfig ens33 | sed -n '2p'  #打印第二行
        inet 192.168.8.100  netmask 255.255.255.0  broadcast 192.168.8.255

[root@localhost ~]#ifconfig ens33 | sed '1q'  #打印第一行
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

[root@localhost ~]#ifconfig ens33 | sed '3q'   #打印第一行到第三行
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.8.100  netmask 255.255.255.0  broadcast 192.168.8.255
        inet6 fe80::dc8b:de58:8fff:ce65  prefixlen 64  scopeid 0x20<link>

[root@localhost ~]#ifconfig ens33 | sed -n '3p' #打印第三行
        inet6 fe80::dc8b:de58:8fff:ce65  prefixlen 64  scopeid 0x20<link>

[root@localhost ~]#ifconfig ens33 | sed -n '1,3p'   #打印第一行到第三行
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.8.100  netmask 255.255.255.0  broadcast 192.168.8.255
        inet6 fe80::dc8b:de58:8fff:ce65  prefixlen 64  scopeid 0x20<link>

[root@localhost ~]#ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.8.100  netmask 255.255.255.0  broadcast 192.168.8.255
        inet6 fe80::dc8b:de58:8fff:ce65  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:76:f0:1a  txqueuelen 1000  (Ethernet)
        RX packets 177196  bytes 251398928 (239.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21093  bytes 1321207 (1.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

#打印3-5行
[root@localhost ~]#ifconfig ens33 | sed -n '3,+2p'
        inet6 fe80::dc8b:de58:8fff:ce65  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:76:f0:1a  txqueuelen 1000  (Ethernet)
        RX packets 177151  bytes 251395544 (239.7 MiB)

[root@localhost ~]#seq 10 | sed -n 'n;p'   #打印偶数行 n将下一行留在高级空间
2
4
6
8
10

[root@localhost ~]#seq 10 | sed -n '2,${n;p}'  #从2开始打印奇数行
3
5
7
9


[root@localhost ~]#seq 10 | sed '2d'   #删除第二行
1
3
4
5
6
7
8
9
10

[root@localhost ~]#seq 10 | sed '0~2d'  #0开始步长为2的删除
1
3
5
7
9

[root@localhost ~]#seq 10 | sed '1~2d'  #1开始步长为2的删除
2
4
6
8
10


[root@localhost ~]#seq 10 | sed '3a#'   #a表示在3后面插入内容
1
2
3
#
4
5
6
7
8
9
10

[root@localhost ~]#seq 10 | sed '3a@'
1
2
3
@
4
5
6
7
8
9
10

[root@localhost ~]#seq 10 | sed '3i*'  #i表示在3前面插入内容
1
2
*
3
4
5
6
7
8
9
10

[root@localhost ~]#seq 10 | sed '3chello'  #c表示替换3的内容
1
2
hello
4
5
6
7
8
9
10

[root@localhost ~]#seq 10 | sed '3a aa\nbb\ncc'    #在3后面插入aa bb cc \n换行
1
2
3
aa
bb
cc
4
5
6
7
8
9
10

[root@localhost ~]#seq 10 | sed '3i aa\nbb\ncc'   #在3前面插入aa bb cc \n换行
1
2
aa
bb
cc
3
4
5
6
7
8
9
10

[root@localhost ~]#seq 10 | sed '3c aa\nbb\ncc'   #将3内容替换成aa bb cc \n换行
1
2
aa
bb
cc
4
5
6
7
8
9
10



[root@localhost ~]#vim test.txt
[root@localhost ~]#cat test.txt
1
2
3
4
5
6
7
8
9
10

[root@localhost ~]#sed -i.bak '3ajkl' test.txt   #在3后面插入内容
[root@localhost ~]#cat test.txt  #查看
1
2
3
jkl
4
5
6
7
8
9
10

[root@localhost ~]#sed -i.bak '3ihjk' test.txt   #在3前面插入内容
[root@localhost ~]#cat test.txt  #查看
1
2
hjk
3
4
5
6
7
8
9
10


[root@localhost ~]#sed -i.bak '3chello' test.txt  #将3替换成hello
[root@localhost ~]#cat test.txt
1
2
hello
4
5
6
7
8
9
10

[root@localhost ~]#seq 10 >test.txt    #1-10追加到test.txt文档中
[root@localhost ~]#cat test.txt
1
2
3
4
5
6
7
8
9
10

[root@localhost ~]#sed -i.bak '4d' test.txt  #删除第4行

[root@localhost ~]#ls
anaconda-ks.cfg  initial-setup-ks.cfg  test.txt.bak  模板  图片  下载  桌面
expect           test.txt              公共          视频  文档  音乐

[root@localhost ~]#cat test.txt    #查看文档,第4行已经删除
1
2
3
5
6
7
8
9
10

[root@localhost ~]#cat test.txt.bak
1
2
3
4
5
6
7
8
9
10


[root@localhost ~]#seq 10 | sed 'p' #p带有自动打印功能,又打印一遍内容
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
10

[root@localhost ~]#sed -n '/^r/,/^d/p' /etc/passwd   #/etc/passwd中以r开关,以d结尾的行

[root@localhost ~]#sed -i 's/r..t/&er/g' /etc/passwd
[root@localhost ~]#cat /etc/passwd
rooter:x:0:0:rooter:/rooter:/bin/bash

[root@localhost ~]#echo 123abcdef | grep -E '[0-9]+'
123abcdef

[root@localhost ~]#echo 123abcdef | awk -Fa '{print $1}'
123

[root@localhost ~]#echo 123abcdef | sed -rn 's/(123)(abc)(def)/\1/p'
123

[root@localhost ~]#echo 123abcdef | sed -rn 's/(123)(abc)(def)/\3\2\1/p'
defabc123

[root@localhost ~]#echo 123abcdef | sed -rn 's/(123)(abc)(def)/\2\3\1/p'
abcdef123

[root@localhost ~]#echo 123abcdef | sed -rn 's/(123)(abc)(def)/\2\1\3/p'
abc123def

[root@localhost ~]#echo "/etc/sysconfig/network-scripts/ifcfg-ens33" | sed -nr 's@(.*/)(.*)@\2@p' 
ifcfg-ens33

[root@localhost ~]#echo "/etc/sysconfig/network-scripts/ifcfg-ens33" | sed -nr 's@(.*/)(.*)@\1@p' 
/etc/sysconfig/network-scripts/

[root@localhost ~]#echo "/etc/sysconfig/network-scripts/ifcfg-ens33" | sed -nr 's@(.*/)(.*)@\0@p' 
/etc/sysconfig/network-scripts/ifcfg-ens33