sed
sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。
sed是操作、过滤和转换文本内容的强大工具
常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤指定字符串)、取行(取出指定行)。
语法:
sed [选项] [sed内置命令字符] [输入文件]
选项:
参数选项 | 解释 |
---|---|
-n | 取消默认sed的输出,常与sed内置命令p一起用(p代表打印) |
-i | 直接将修改结果写入文件,不用-i,sed修改的是内存数据 |
-e | 多次编辑,不需要管道符了 |
-r | 支持正则扩展 |
sed的内置命令符用于对文件进行不同的操作功能,如对文件增删改查
sed常用内置命令字符:
sed的内置命令字符 | 解释 |
---|---|
a | append,对文本追加,在指定行后面添加一行/多行文本 |
d | Delete,删除匹配行 |
i | Insert,表示插入文本,在指定行前添加一行/多行文本 |
p | Print,打印匹配行的内容,通常p与-n一起用 |
s/正则/替换内容/g | 匹配正则内容,然后替换内容(支持正则),结尾g代表全局匹配 |
sed匹配范围
范围 | 解释 |
---|---|
空地址 | 全文处理 |
单地址 | 指定文件某一行 |
/pattern/ | 被模式匹配的每一行 |
范围区间 | 10,20 十到二十行,10,+5 第10行向下5行, /pattern1/,/pattern2/ |
步长 | 1~2,表示1,3,5,7,9行,奇数行;2~2,表示2,4,6,8,10行,偶数行 |
案例
1.打印输出第二,三行
[root@timy-test-k8s01 ~]# cat test.txt 1. My name is timy 2. I learn Linux 3. I like fatniess 4. My qq is 12345678 5. I love zhuer [root@timy-test-k8s01 ~]# sed "2,3p" -n test.txt #打印输出第2,3行,p代表打印。如果不加-n会默认全部行打印输出 2. I learn Linux 3. I like fatniess [root@timy-test-k8s01 ~]# sed "2,3p" test.txt #不加-n会默认全部打印显示 1. My name is timy 2. I learn Linux 2. I learn Linux 3. I like fatniess 3. I like fatniess 4. My qq is 12345678 5. I love zhuer
2.过滤出含有Linux的字符串
[root@timy-test-k8s01 ~]# sed -n '/Linux/p' test.txt 2. I learn Linux
3.删除第3行到结尾
[root@timy-test-k8s01 ~]# sed '3,$d' test.txt #只删除输出数据的第3行到第5行,不修改文件数据 1. My name is timy 2. I learn Linux [root@timy-test-k8s01 ~]# cat test.txt 1. My name is timy 2. I learn Linux 3. I like fatniess 4. My qq is 12345678 5. I love zhuer
4.将所有的My替换成I
[root@timy-test-k8s01 ~]# sed "s/My/I/g" test.txt #不用-i,只是修改的内存数据 1. I name is timy 2. I learn Linux 3. I like fatniess 4. I qq is 12345678 5. I love zhuer [root@timy-test-k8s01 ~]# cat test.txt 1. My name is timy 2. I learn Linux 3. I like fatniess 4. My qq is 12345678 5. I love zhuer [root@timy-test-k8s01 ~]# sed "s/My/I/g" test.txt -i #使用-i,直接将修改的结果写入文件。 [root@timy-test-k8s01 ~]# cat test.txt 1. I name is timy 2. I learn Linux 3. I like fatniess 4. I qq is 12345678 5. I love zhuer [root@timy-test-k8s01 ~]#
5.将所有I换成My,并将qq号改成87654321
[root@timy-test-k8s01 ~]# cat test.txt 1. I name is timy 2. I learn Linux 3. I like fatniess 4. I qq is 12345678 5. I love zhuer [root@timy-test-k8s01 ~]# sed -e "s/I/My/g" -e "s/12345678/87654321/g" test.txt -i #-e参数可以进行多次编辑 [root@timy-test-k8s01 ~]# cat test.txt 1. My name is timy 2. My learn Linux 3. My like fatniess 4. My qq is 87654321 5. My love zhuer
6.在第二行后追加内容
[root@timy-test-k8s01 ~]# sed "2a My Linux is good" test.txt -i #a代表在指定行后面追加一行内容 [root@timy-test-k8s01 ~]# cat test.txt 1. My name is timy 2. My learn Linux My Linux is good 3. My like fatniess 4. My qq is 87654321 5. My love zhuer
7.在第3行后追加两行内容,使用换行符
[root@timy-test-k8s01 ~]# sed "3a I like girl \n I like pretty girl" test.txt -i [root@timy-test-k8s01 ~]# cat test.txt 1. My name is timy 2. My learn Linux My Linux is good I like girl I like pretty girl 3. My like fatniess 4. My qq is 87654321 5. My love zhuer
8.在每行后面添加分隔符号
[root@timy-test-k8s01 ~]# sed "a -------------" test.txt -i [root@timy-test-k8s01 ~]# cat test.txt 1. My name is timy ------------- 2. My learn Linux ------------- My Linux is good ------------- I like girl ------------- I like pretty girl ------------- 3. My like fatniess ------------- 4. My qq is 87654321 ------------- 5. My love zhuer -------------
sed配合正则表达式企业案例
取出Linux的IP地址
1.删除网卡信息
[root@timy-test-k8s01 ~]# ifconfig ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.16.66.88 netmask 255.255.255.0 broadcast 10.16.66.255 inet6 fe80::2834:95d6:baaa:9918 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:d1:81:3e txqueuelen 1000 (Ethernet) RX packets 11880027 bytes 775641366 (739.7 MiB) RX errors 0 dropped 305 overruns 0 frame 0 TX packets 76973 bytes 6320158 (6.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 32 bytes 2592 (2.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 32 bytes 2592 (2.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2.去头去尾法
交给管道符,一次去头,一次去尾
[root@timy-test-k8s01 ~]# ifconfig ens192 #只显示ens192网卡信息 ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.16.66.88 netmask 255.255.255.0 broadcast 10.16.66.255 inet6 fe80::2834:95d6:baaa:9918 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:d1:81:3e txqueuelen 1000 (Ethernet) RX packets 11880510 bytes 775671449 (739.7 MiB) RX errors 0 dropped 305 overruns 0 frame 0 TX packets 76997 bytes 6323422 (6.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@timy-test-k8s01 ~]# ifconfig ens192 | sed "2p" -n #只显示第二行 inet 10.16.66.88 netmask 255.255.255.0 broadcast 10.16.66.255 [root@timy-test-k8s01 ~]# ifconfig ens192 | sed "2p" -n | sed "s/^.*inet//" #去头,删除IP地址前面的空格和inet 10.16.66.88 netmask 255.255.255.0 broadcast 10.16.66.255 [root@timy-test-k8s01 ~]# ifconfig ens192 | sed "2p" -n | sed "s/^.*inet//" | sed "s/net.*$//" #去尾,删除netmask后面所有字符 10.16.66.88
3.使用-e多次编辑法
[root@timy-test-k8s01 ~]# ifconfig ens192 | sed "2s/^.*inet//p" -n #删除IP地址前的空格和inet,并打印显示出来 10.16.66.88 netmask 255.255.255.0 broadcast 10.16.66.255 [root@timy-test-k8s01 ~]# ifconfig ens192 | sed -e "2s/^.*inet//" -n -e "2s/net.*$//p" 10.16.66.88