sed 命令
sed:Stream EDitor, 行编辑器
工作过程:
1、常用选项
-n:不输出模式中的内容至屏幕
-e:多点编辑
-f /PATH/TO/SCRIPT_FILE:从指定文件中读取编辑脚本;每行一个编辑命令
-r:支持使用扩展正则表达式
-i:原处编辑
2、地址定界
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2:所有奇数行
2~2:所有偶数行
3、编辑命令
d: 删除
p: 显示模式空间中的内容
a \text:在行后面追加文本;支持使用\n实现多行追加
i \text:在行前面插入文本;支持使用\n实现多行插入
c \text:替换行为单行或多行文本
w /path/to/somefile: 保存模式空间匹配到的行至指定文件中
r /path/from/somefile:读取指定文件的文本流至模式空间中匹配到的行的行后,文件合并
=: 为模式空间中的行打印行号
!: 取反条件,放在模式后的命令之前
s///:支持使用其它分隔符,s@@@,s###
替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中
1、删除1~5行的内容
[root@localhost ~]# sed "1,5d" /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=616aba39-6fd4-4727-9ab6-7c8787d65bf5 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap
2、显示偶数行
[root@localhost ~]# sed '1~2d' /etc/fstab
#
# Created by anaconda on Sat Jun 26 10:50:29 2021
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
UUID=616aba39-6fd4-4727-9ab6-7c8787d65bf5 /boot
3、奇数行打印两遍
[root@localhost ~]# sed '1~2p' /etc/fstab
#
# /etc/fstab
# /etc/fstab
# Created by anaconda on Sat Jun 26 10:50:29 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
# 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-root / xfs defaults 0 0
UUID=616aba39-6fd4-4727-9ab6-7c8787d65bf5 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
4、禁用默认的行为,只保留编辑后的行为
[root@localhost ~]# sed -n '1~2p' /etc/fstab
# /etc/fstab
#
# 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
5、在第三行前面插入多个个新的内容,同理在第三行后面
[root@localhost ~]# sed '3i \insert test characters.\nanother new line.' /etc/fstab | head -5
#
insert test characters.
another new line.
# /etc/fstab
5、将匹配到的行替换为指定的文本
[root@localhost ~]# sed '/^UUID/c \#this is a uuid' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Jun 26 10:50:29 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
#
/dev/mapper/centos-root / xfs defaults 0 0
#this is a uuid
/dev/mapper/centos-swap swap swap defaults 0 0
6、保存匹配到的内容到指定的文件中
[root@localhost tmp]# sed -n '/^[^#]/w /tmp/fstab.txt' /etc/fstab
7、将/etc/issue文件中的内容放在/etc/fstab中第二行的后面
[root@localhost tmp]# cat /etc/issue
\S
Kernel \r on an \m
[root@localhost tmp]# sed '2r /etc/issue' /etc/fstab
#
\S
Kernel \r on an \m
# /etc/fstab
# Created by anaconda on Sat Jun 26 10:50:29 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
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=616aba39-6fd4-4727-9ab6-7c8787d65bf5 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
8、只显示非#开头的行
[root@localhost tmp]# sed -n '/^#/!p' /etc/fstab
/dev/mapper/centos-root / xfs defaults 0 0
UUID=616aba39-6fd4-4727-9ab6-7c8787d65bf5 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
练习:
1、删除/boot/grub2/grub.conf文件中所有以空白开头的行行首的空白字符
[root@localhost etc]# sed 's@^[[:space:]]\+@@' /boot/grub2/grub.cfg
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
[root@localhost ~]# sed 's@^#[[:space:]]\+@@' /etc/fstab
3、echo一个绝对路径给sed命令,取出其基名;取出其目录名
[root@localhost ~]# echo "/var/log/messages" | sed -r 's@[^/]\+/?$@@'
/var/log/messages
[root@localhost ~]# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'
/var/log/