sed的基本用法
sed 格式 sed [选项] [脚本命令] 文件名
p==print
d:delete
=:打印匹配行的行号
-n 取消默认的完整输出,只要需要的
-e 允许多项编辑
-i 修改文件内容
-r 不需要转义
注意:& 符号在sed命令中代表上次匹配的结果
a\ 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
c\ 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用""续行
i\ 在当前行之前插入文本。多行时除最后一行外,每行末尾需用""续行
d 删除行
h 把模式空间里的内容复制到暂存缓冲区
H 把模式空间里的内容追加到暂存缓冲区
g 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
l 列出非打印字符
p 打印行
n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
q 结束或退出sed
r 从文件中读取输入行
! 对所选行以外的所有行应用命令
s 用一个字符串替换另一个
g 在行内进行全局替换
w 将所选的行写入文件
x 交换暂存缓冲区与模式空间的内容
y 将字符替换为另一字符(不能对正则表达式使用y命令)
sed script里什么也不写就带表标准输入的东西打印两边
[15:36:52 root@magedu\ [ ~]#sed ''
welcom
welcom
hello
hello
默认是打印模式空间里的东西
sed '' /etc/iss
\S
Kernel \r on an \m
如果加了P就是打印两遍
[15:43:41 root@magedu\ [ ~]#sed 'p' /etc/issue
\S
\S
Kernel \r on an \m
Kernel \r on an \m
假如-n选项就是关闭自动打印
15:43:50 root@magedu\ [ ~]#sed -n 'p' /etc/issue
\S
Kernel \r on an \m
如何取出文件中的指定行 下例子取出passwd文件中的第四行
[15:44:40 root@magedu\ [ ~]#sed -n '4p' /etc/passwd
adm❌3:4:adm:/var/adm:/sbin/nologin
[15:46:11 root@magedu\ [ ~]#ifconfig | sed -n '2p'
inet 10.0.0.150 netmask 255.255.255.0 broadcast 10.0.0.255
下面的例子是如何取出最后一行
[15:47:21 root@magedu\ [ ~]#ifconfig | sed -n '$p' /etc/passwd
kangkang❌1019:1022::/home/kangkang:/bin/bash
sed命令也支持正则表达式 要使用扩展正则表达式要加 -r
[15:49:46 root@magedu\ [ ~]#df |sed -n '/^/dev/sd*/p'
/dev/sda2 104806400 13837664 90968736 14% /
/dev/sda3 52403200 798884 51604316 2% /data
/dev/sda1 999320 192956 737552 21% /boot
取奇数行
[15:55:14 root@magedu\ [ ~]#seq 10 | sed -n '1~2p'
1
3
5
7
9
取偶数行
[15:55:38 root@magedu\ [ ~]#seq 10 | sed -n '0~2p'
2
4
6
8
10
取3-10
[15:58:00 root@magedu\ [ ~]#seq 10 | sed -n '3,10p'
3
4
5
6
7
8
9
10
取1-5
[16:02:44 root@magedu\ [ ~]#seq 10 |sed -n '1,5p'
1
2
3
4
5
取3-7
[16:03:20 root@magedu\ [ ~]#seq 10 |sed -n '3,+4p'
3
4
5
6
7
[16:04:04 root@magedu\ [ ~]#seq 10|sed -n '3,7p'
3
4
5
6
7
删除操作 奇数行
[16:21:30 root@magedu\ [ ~]#seq 10 |sed '1~2d'
2
4
6
8
10
删除偶数行
[16:22:10 root@magedu\ [ ~]#seq 10 |sed '2~2d'
1
3
5
7
9
-e命令可以连续操作文件 也可以用;
[16:23:03 root@magedu\ [ ~]#sed -e '3d' -e '4d' seq.log
1
2
5
6
7
8
9
10
[16:23:25 root@magedu\ [ ~]#sed -e '3d;4d' seq.log
1
2
5
6
7
8
9
10
-i 对文件直接操作 后面加上.xxx 为源文件备份 如果直接-i就是对文件直接操作不备份
[16:25:44 root@magedu\ [ ~]#sed -i.bak '3d;4d' seq.log
[16:26:32 root@magedu\ [ ~]#cat seq.log
1
2
5
6
7
8
9
10
[16:26:40 root@magedu\ [ ~]#cat seq.log.bak
1
2
3
4
5
6
7
8
9
10
号开头的行
[16:26:48 root@magedu\ [ ~]#sed -n '/^#/p' /etc/fstab
/etc/fstab
Created by anaconda on Sun Nov 1 18:37:06 2020
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.
非#开头的行 (仔细的小伙伴发现空行也消失了,这不是我们想要的结果)
[16:33:23 root@magedu\ [ ~]#sed -n '/[#]/p' /etc/fstab
UUID=2622f9d2-4cc6-4a23-9fdc-258cfafc2d36 / xfs defaults 0 0
UUID=bffdb53f-8001-4f45-b28a-49ebed01dbcf /boot ext4 defaults 1 2
UUID=5b71c7d5-c296-48b5-b6dc-987605580d0a /data xfs defaults 0 0
UUID=0b082313-e11e-4103-b18a-b316136f0cd5 swap swap defaults
下面这个才是非#开头的行 我们可以用上面的方法把空行也一并去掉
16:38:42 root@magedu\ [ ~]#sed -n '/^#/!p' /etc/fstab
UUID=2622f9d2-4cc6-4a23-9fdc-258cfafc2d36 / xfs defaults 0 0
UUID=bffdb53f-8001-4f45-b28a-49ebed01dbcf /boot ext4 defaults 1 2
UUID=5b71c7d5-c296-48b5-b6dc-987605580d0a /data xfs defaults 0 0
UUID=0b082313-e11e-4103-b18a-b316136f0cd5 swap
下面是展示分组 在 quiet 和 " 中间加个nvme
[16:48:47 root@magedu\ [ ~]#sed -nE '/4/s@(^.*)(quiet)(")@\1\2nvme\3@p' /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=0b082313-e11e-4103-b18a-b316136f0cd5 rhgb quietnvme"
浙公网安备 33010602011771号