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