系统相关
首页 > 系统相关> > Linux文本处理sed命令高级用法

Linux文本处理sed命令高级用法

作者:互联网

sed 工作原理

sed 模式空间

sed 模式空间相关命令

sed 保持空间

sed 保持空间相关命令

sed 模式空间和保持空间使用范例

模式空间覆盖保持空间,再保持空间覆盖模式空间

[root@C8-192 ~]# seq 4 | sed '/3/h;g'


3
3

模式空间覆盖保持空间,再保持空间追加模式空间

[root@C8-192 ~]# seq 4 | sed '/3/h;G'
1

2

3
3
4
3

模式空间追加保持空间,再保持空间覆盖模式空间

[root@C8-192 ~]# seq 4 | sed '/3/H;g'



3

3

模式空间追加保持空间,再保持空间追加模式空间

[root@C8-192 ~]# seq 4 | sed '/3/H;G'
1

2

3

3
4

3

模式空间替换保持空间,再模式空间覆盖保持空间

[root@C8-192 ~]# seq 4 | sed '/3/x;h'
1
2
2
4

模式空间替换保持空间,再模式空间追加保持空间

[root@C8-192 ~]# seq 4 | sed '/3/x;H'
1
2

1
2
4

模式空间替换保持空间,再保持空间覆盖模式空间

[root@C8-192 ~]# seq 4 | sed '/3/x;g'


3
3

模式空间替换保持空间,再保持空间追加模式空间

[root@C8-192 ~]# seq 4 | sed '/3/x;G'
1

2


3
4
3

sed高级用法范例

打印偶数行

seq 10 | sed -n 'n;p'
2
4
6
8
10

打印奇数行

seq 10 | sed 'n;d'
1
3
5
7
9

一列分两列

seq 10 | sed 'N;s/\n//'
12
34
56
78
910
seq 10 | sed '/3/N;s/\n//'
1
2
34
5
6
7
8
9
10

倒叙排列

seq 10 | sed '1!G;h;$!d'
10
9
8
7
6
5
4
3
2
1
seq 10 | sed -n '1!G;h;$p'
10
9
8
7
6
5
4
3
2
1

取匹配到的行的前一行

seq 10 | sed -n '/5/{g;1!p;};h'
4

取匹配到的行的后一行

seq 10 | sed -nr '/5/{n;p}'
6

查看匹配到的最后一行,功能类似于tail

seq 10 | sed 'N;D'
10
seq 10 | sed '$!d'
10
[root@C8-192 ~]# tail -n 1 /var/log/messages
Jun  1 18:22:49 C8-192 systemd[1]: Started dnf makecache.
[root@C8-192 ~]# cat /var/log/messages | sed 'N;D'
Jun  1 18:22:49 C8-192 systemd[1]: Started dnf makecache.
[root@C8-192 ~]# sed '$!d' /var/log/messages 
Jun  1 19:22:54 C8-192 systemd[1]: Started dnf makecache.

调换匹配行的前后次序

seq 10 |sed '5h;9G;9!d'
9
5
sed  '/i/h;/you/G;/you/!d;' iloveyou.log 
you
i

显示匹配到的行的后两行,类似于tail -n 2

seq 10 | sed '$!N;$!D'
9
10
sed '$!N;$!D' /var/log/messages 
Jun  1 19:22:54 C8-192 systemd[1]: dnf-makecache.service: Succeeded.
Jun  1 19:22:54 C8-192 systemd[1]: Started dnf makecache.
tail -n 2 /var/log/messages 
Jun  1 19:22:54 C8-192 systemd[1]: dnf-makecache.service: Succeeded.
Jun  1 19:22:54 C8-192 systemd[1]: Started dnf makecache.

每行后边加个空行

sed '/^$/d;G' iloveyou.log 
i

love

you
[root@C8-192 ~]# sed '/love/d;G' iloveyou.log 
i

you

[root@C8-192 ~]# sed '/love/d' iloveyou.log 
i
you

用井号注释掉需要删除的内容

sed -r 's/(love)/##\1/;G' iloveyou.log 
i

##love

you

练习示例

1、删除centos8系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符

sed -ri.bak 's/^[[:blank:]](.*)/\1/' /etc/grub2.cfg

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

sed  -ri.bak 's/^#+[[:blank:]](.*)/\1/g' /etc/grub2.cfg

3、在centos8系统/root/iloveyou.log每一行行首增加#号

[root@C8-192 ~]# cat iloveyou.log 
i
love
you
[root@C8-192 ~]# sed -ri.bak 's/(.*)/#\1/g' iloveyou.log 
[root@C8-192 ~]# cat iloveyou.log
#i
#love
#you

4、在/etc/fstab文件中不以#开头的行的行首增加#号

[root@C8-192 ~]# sed -n '/^[^#]/p' fstab.log 
UUID=827b1562-fd3a-4e03-ad8b-f4c0b8def517 /                       xfs     defaults        0 0
UUID=ea560777-7040-46e1-9931-633142400896 /boot                   ext4    defaults        1 2
UUID=5de69ef1-4e31-40b8-832f-91c00cd57873 /data                   xfs     defaults        0 0
UUID=b3fd1c68-6653-41ff-8ecb-25fdcfeeced9 swap                    swap    defaults        0 0
[root@C8-192 ~]# sed -r '/^[^#]/s/(.*)/#\1/' fstab.log 

#
# /etc/fstab
# Created by anaconda on Wed May 19 22:15:11 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
#UUID=827b1562-fd3a-4e03-ad8b-f4c0b8def517 /                       xfs     defaults        0 0
#UUID=ea560777-7040-46e1-9931-633142400896 /boot                   ext4    defaults        1 2
#UUID=5de69ef1-4e31-40b8-832f-91c00cd57873 /data                   xfs     defaults        0 0
#UUID=b3fd1c68-6653-41ff-8ecb-25fdcfeeced9 swap                    swap    defaults        0 0

5、处理/etc/fstab路径,使用命令取出其目录名和基名

echo "/etc/fstab" |awk -F'/' '{print $2,$3}' 
etc fstab

6、利用sed 取出ifconfig命令中本机的IPv4地址
ifconfig | sed -nr '/eth0/{n;p}' | awk '{print $2}'

[root@C8-192 ~]# ifconfig | sed -nr '/eth0/{n;p}'
        inet 10.0.0.192  netmask 255.255.255.0  broadcast 10.0.0.255
[root@C8-192 ~]# ifconfig | sed -nr '/eth0/{n;p}' | awk '{print $2}'
10.0.0.192

标签:sed,模式,192,C8,Linux,空间,文本处理,root
来源: https://blog.csdn.net/timonium/article/details/117437944