系统运维-15-1-Sed编辑器

0.Sed编辑器相对比较容易理解,主要难点在后面的高级用法中,要理解模式空间和保持空间,空间之间相互写入(一般小写为覆盖写入,大写为追加写入),正常流程一般是从指定文件读取,按规则判断后写入模式空间,按规则判断后写入保持空间,保持空间最终输出。

1.删除命令。

cat /etc/fstab查看一个已有文件。sed '/UUID/d' /etc/fstab将符合条件的行删除后输出。sed '/^#/d' /etc/fstab删除#号开头的行。sed '/^$/d' /etc/fstab删除空行。sed '1,4d' /etc/fstab删除第1至4行。

[root@lab1 ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

[root@lab1 ~]# sed '/UUID/d' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@lab1 ~]# sed '/^#/d' /etc/fstab

/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@lab1 ~]# sed '/^$/d' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@lab1 ~]# sed '1,4d' /etc/fstab
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
 

2.打印命令。

sed '/^UUID/p' /etc/fstab将符合条件的行打印输出,发现符合条件的行出现两次,这时因为同时有标准输出和打印输出。sed -n '/^UUID/p' /etc/fstab将标准输出禁用掉即只有打印输出。sed '/^UUID/d' /etc/fstab查看和上条命令完全相反的结果。

[root@lab1 ~]# sed '/^UUID/p' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@lab1 ~]# sed -n '/^UUID/p' /etc/fstab
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0

[root@lab1 ~]# sed '/^UUID/d' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
 

3.追加写入命令。

sed '/^UUID/a \"# hello world."' /etc/fstab在符合条件的行后追加写入。sed '/^UUID/a \"# hello world.\nwelcome!"' /etc/fstab在符合条件的行后追加写入多行。sed '/^UUID/i \"# hello world.\nwelcome!"' /etc/fstab在符合条件的行前追加写入多行。

[root@lab1 ~]# sed '/^UUID/a \"# hello world."' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
"# hello world."
/dev/mapper/centos-swap swap                    swap    defaults        0 0

[root@lab1 ~]# sed '/^UUID/a \"# hello world.\nwelcome!"' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
"# hello world.
welcome!"
/dev/mapper/centos-swap swap                    swap    defaults        0 0

[root@lab1 ~]# sed '/^UUID/i \"# hello world.\nwelcome!"' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
"# hello world.
welcome!"
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
 

4.替换命令。

sed '/^UUID/c \"# hello world.\nwelcome!"' /etc/fstab将符合条件的行替换为指定的多行内容。

[root@lab1 ~]# sed '/^UUID/c \"# hello world.\nwelcome!"' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
"# hello world.
welcome!"
/dev/mapper/centos-swap swap                    swap    defaults        0 0
 

5.保存命令。

sed '/^UUID/w /tmp/fstab.txt' /etc/fstab将符合条件的行保存到指定的文件。cat /tmp/fstab.txt 查看指定的文件验证效果。

[root@lab1 ~]# sed '/^UUID/w /tmp/fstab.txt' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@lab1 ~]# cat /tmp/fstab.txt 
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
 

6.行号命令

sed '/^UUID/=' /etc/fstab显示匹配到的行号。

[root@lab1 ~]# sed '/^UUID/=' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
10
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
 

7.读入命令

sed '3r /tmp/fstab.txt' /etc/fstab 将指定文件的内容写入到指定位置。

[root@lab1 ~]# sed '3r /tmp/fstab.txt' /etc/fstab 

#
# /etc/fstab
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
 

8.否定命令

sed '/^UUID/!d' /etc/fstab将所有没有删除的内容显示出来。

[root@lab1 ~]# sed '/^UUID/!d' /etc/fstab
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
 

9.替换命令

sed 's@^UUID@uuid@g' /etc/fstab将内容替换为指定内容。sed '[email protected]@&er@' /etc/passwd将内容替换为指定内容(原内容追加)。

[root@lab1 ~]# sed 's@^UUID@uuid@g' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  5 07:16:07 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
uuid=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@lab1 ~]# sed '[email protected]@&er@' /etc/passwd
rooter:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/rooter:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/fterp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
student:x:1000:1000:student:/home/student:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash
user4:x:1004:1004::/home/user4:/bin/bash
user6:x:1006:1006::/home/user6:/bin/bash
user7:x:1007:1007::/home/user7:/bin/bash
user8:x:1008:1008::/home/user8:/bin/bash
user9:x:1009:1009::/home/user9:/bin/bash
user10:x:1010:1010::/home/user10:/bin/bash
user3:x:1011:1011::/home/user3:/bin/bash
user5:x:1012:1012::/home/user5:/bin/bash
 

10.sed 's@[[:space:]]\+@@' /etc/grub2.cfg将空格删除。sed 's@^#[[:space:]]\+@@' /etc/fstab将#空格开头的行删除。echo "/etc/sysconfig" | sed 's@[^/]\+$@@'提取目录。echo "/etc/sysconfig/" | sed 's@[^/]\+$@@'当结尾为/时提取目录不准确。echo "/etc/sysconfig/" | sed 's@[^/]\+/\?$@@'增加对结尾的判断后提取目录。

[root@lab1 ~]# sed 's@[[:space:]]\+@@' /etc/grub2.cfg
[root@lab1 ~]# sed 's@^#[[:space:]]\+@@' /etc/fstab 
[root@lab1 ~]# echo "/etc/sysconfig" | sed 's@[^/]\+$@@'
/etc/
[root@lab1 ~]# echo "/etc/sysconfig/" | sed 's@[^/]\+$@@'
/etc/sysconfig/
[root@lab1 ~]# echo "/etc/sysconfig/" | sed 's@[^/]\+/\?$@@'
/etc/

11.sed -n '[email protected]@&er@p' /etc/passwd将替换的行显示出来。

[root@lab1 ~]# sed -n '[email protected]@&er@p' /etc/passwd
rooter:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/rooter:/sbin/nologin
ftp:x:14:50:FTP User:/var/fterp:/sbin/nologin
 

12.高级用法

在高级用法用主要时要知道sed编辑器的模式空间和保持空间,对文件内容读取后先放到模式空间,按照命令进行判断操作后放到保持空间。vim test.txt创建一个测试文件。cat test.txt 查看测试文件的内容。

[root@lab1 ~]# vim test.txt
[root@lab1 ~]# cat test.txt 
1
2
3
4
5
6

sed -n 'n;p' test.txt显示偶数行。这里做一点简单解释:当读到1时,按照判断规则n,会把2写入模式空间,按照规则p,输出到保持空间,读到2时,因为已经存在,会跳过,当读到3时,按照判断规则n,会把4写入模式空间,按照规则p,输出到保持空间,读到4时,因为已经存在,会跳过,当读到5时,按照判断规则n,会把6写入模式空间,按照规则p,输出到保持空间,读到6时,因为已经存在,会跳过,最终模式空间的值为2 4 6。
[root@lab1 ~]# sed -n 'n;p' test.txt 
2
4
6

sed '1!G;h;$!d' test.txt 逆向显示文件内容。这里做一点简单解释:

当读到1时,模式空间为1---》1!G---》模式空间为1---》h---》b保持空间为1---》$!d---》模式空间为空

当读到2时,模式空间为2---》1!G---》模式空间为2,1---》h---》b保持空间为2,1---》$!d---》模式空间为空

当读到3时,模式空间为3---》1!G---》模式空间为3,2,1---》h---》b保持空间为3,2,1---》$!d---》模式空间为空

当读到4时,模式空间为4---》1!G---》模式空间为4,3,2,1---》h---》b保持空间为4,3,2,1---》$!d---》模式空间为空

当读到5时,模式空间为5---》1!G---》模式空间为5,4,3,2,1---》h---》b保持空间为5,4,3,2,1---》$!d---》模式空间为空

当读到6时,模式空间为6---》1!G---》模式空间为6,5,4,3,2,1---》h---》b保持空间为6,5,4,3,2,1---》$!d---》模式空间为6,5,4,3,2,1
[root@lab1 ~]# sed '1!G;h;$!d' test.txt 
6
5
4
3
2
1

sed '$!N;$!D' test.txt显示文件后两行。
[root@lab1 ~]# sed '$!N;$!D' test.txt 
5
6

sed '$!d' test.txt 取出文件最后一行。
[root@lab1 ~]# sed '$!d' test.txt 
6

sed 'G' test.txt每行后增加一个空白行

[root@lab1 ~]# sed 'G' test.txt 
1

2

3

4

5

6

sed 'g' test.txt 全部替换为空白行

[root@lab1 ~]# sed 'g' test.txt 

sed '/^$/d;G' test.txt每行后增加一个空白行,如果有多行空白则合并为一个空白行。

[root@lab1 ~]# sed '/^$/d;G' test.txt 
1

2

3

4

5

6

sed 'n;d' test.txt显示奇数行。

[root@lab1 ~]# sed 'n;d' test.txt 
1
3
5

sed '1!G;h;$p' test.txt递增重复逆序排列。
[root@lab1 ~]# sed '1!G;h;$p' test.txt 
1
2
1
3
2
1
4
3
2
1
5
4
3
2
1
6
5
4
3
2
1
6
5
4
3
2
1

sed -n '1!G;h;$p' test.txt 逆序排列。
[root@lab1 ~]# sed -n '1!G;h;$p' test.txt 
6
5
4
3
2
1

sed -n '1~2p' test.txt 步进显示奇数行。
[root@lab1 ~]# sed -n '1~2p' test.txt 
1
3
5

sed -n '2~2p' test.txt 步进显示偶数行。
[root@lab1 ~]# sed -n '2~2p' test.txt 
2
4
6

猜你喜欢

转载自blog.csdn.net/ligan1115/article/details/85856258