sed命令参数表
sed参数 | 说明 |
---|---|
a | 在指定行的后面增加新航 |
c | 替换指定行 |
d | 删除行 |
-e | 多次编辑,多次编辑后这样写回文件。sed -i -e '/^[[:space:]]*#/d' -e '/^$/d' nginx.conf |
p | 打印行 |
-r | 激活拓展正则 |
-n | 取消默认输出 |
-i | 静默编辑,屏幕上不显示编辑后的内容,放在最后。避免与生成备份冲突 |
-i.bak | 静默编辑并生成以.bak结尾的原文件 |
1~2p 2~2p | 奇偶序列 |
sed找行
范围行
- 查看passwd文件的第3行:
-n '3p'
[root@wzyCentos test]# cat -n passwd | head -3 |tail -n +33 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@wzyCentos test]# sed -n '3p' passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
- 查看特定范围的行:
-n '3,10p'
[root@wzyCentos test]# sed -n '3,10p' passwd3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/root:/sbin/nologin
- 只查看passwd文件的第3行和第5行:
-n '3p;5p'
[root@wzyCentos test]# sed -n '3p;5p' passwd 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
-
查看最后一行,
'$p'
拓展:第3行到最后一行
'3,$p'
包含关键词
- 找到关键词的行:
-n '/root/p'
- 找到以root开头的行
[root@wzyCentos test]# sed -n /^root/p passno
root:x:0:0:root:/root:/bin/bash
区间行
- 查找101-105开头的行,比如日志文件中的日期
[root@wzyCentos test]# sed -n /100/,/103/p 1.txt
100wzy
101zyz
102666
103
查看上午10点-12点的日志:
sed -n '/2024:15:59:51/,/16:00:00/p' access.log
- 或下半区间没有匹配到,则把上半区间以下的内容全匹配
[root@qwert test]# cat aa
aaa
bbb
ccc
ddd
aaa
bbb
ccc
wzy
[root@qwert test]# sed -n '/aaa/,/ddd/p' aa
aaa
bbb
ccc
ddd
aaa #aaa下面没有ddd,依然输出了
bbb
ccc
wzy
- 如果有多个结尾则以第一个结尾为准
sed匹配奇偶数列
奇数列:以1开始,每次+2[root@wzyCentos test]# seq 10 | sed -n '1~2p'13579
偶数列:以2开始,每次+2[root@wzyCentos test]# seq 10 | sed -n '2~2p'246810
- 同理也可以用于隔行删除
[root@qwert test]# seq 10 | sed '1~2d'
2
4
6
8
10
sed替换s#XX#YY#g
s:substitute替换;
g:global全局(否则只替换每一行第一个匹配到的内容)
#的另外2个平替/和@
[root@wzyCentos test]# sed 's#baidu#wzy#g' replace
pan.wzy.com
替换命令tr
- tr语法:tr ‘要被替换的字符’ ‘替换后的字符’
[root@wzyCentos ~]# echo 'wzy 666'|tr 'wzy' 'www'
www 666
sed条件替换/删除
条件:第X行,以X开头
动作:替换、删除
仅对指定行进行替换:‘3,5s#root#wyy#g’
- 对包含root的行进行替换
- 区间范围’1,10s@root@wzy@g’,替换1-10行中的root为wzy
边界符
- 精确匹配要替换的内容
sed 's#\bbin\b#QQQ#g'
sed 's#\<bin\>#QQQ#g' pass5
- 匹配身份证号
egrep '[0-9]{17}[0-9X]{}'
替换passwd文件中的bin为QQQ,而不替换sbin。同grep的精确匹配
sed重组(后向引用)
应用场景:处理一行中的某个部分,类似awk取列
使用格式:s###g
1️⃣前2个#内,通过正则和()对字符进行分组;
2️⃣后面2个井号之间通过\数字,去调用前面分组的内容
⭐️案例1.
echo 12345678 | sed -r 's#(1)(.*)(8)#\1<\2>\3#g'
,#也可以替换为@或/最终结果:1<234567>8
第一个分组:用()包裹1得到第一个分组(1)
第二个分组:用.*表示2-7,再用()包裹.*得到第二个分组(.*)
\1表示匹配第一个分组即1,\2表示第二个分组即2-7,...最后用<>包裹第二个分组得到<234567>
sed重组排序
- 重新排序
[root@wzyCentos test]# echo 12345678 |sed -r 's#(1)(.*)(8)#\3\2\1#g'
82345671
- 把passwd文件中的最后一列和第一列互换位置
替换前:apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
替换后:/sbin/nologin:x:48:48:Apache:/usr/share/httpd:apache
第一列:apache,表示为^(.*)
第二列::x:48:48:Apache:/usr/share/httpd:
,表示为(:x.*😃,含义以:x开头,中间任意字符,以:结尾
尝试使用(:x.*:$)表示没有用
第三列:/sbin/nologin表示为(.*)
所以最终:sed -r 's@^(.*)(:x.*:)(.*)@\3\2\1@g'
流程图为:
- 找出ip地址
inet 192.168.43.70/24 brd 192.168.43.255 scope global noprefixroute ens33
sed -r 's#^.*net (.*)/.*#\1#'
❓前面不能用.*t $表示
还要显示掩码怎么做?
ip address show ens33|sed -n '3p' | awk '{print $2}'
📨ip I可以直接显示出ip
- 结合之前的至少出现X次重组
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
要求:提取出0644权限
原理:0644是连续4次的数字,即[0-9]{4}
答案:省略
sed+bash执行命令
[root@qwert test]# seq 3|sed -r 's@(.)@touch \1.txt@g'
touch 1.txt
touch 2.txt
touch 3.txt
[root@qwert test]# seq 3|sed -r 's@(.)@touch \1.txt@g'|bash
sed删除
语法:'/XX/d'
说明:把XX给删除
- 把ssh_config中的空行和#号行去掉
sed -r '/^#|^$/d' /etc/ssh/ssh_config
sed -rn '/^#|^$/!p'
同理awk的示例:awk '!/^#|^$/' /etc/ssh/ssh_config!表示取反
删除行
- 删除第3行
'3d'
, - 删除2-5行
'/2,5d/'
- 删除最后一行
'$d'
删除以xx开头的行
- 删除包含root的行
'/root/d'
,删除以root开头的行'/^root/d'
,拓展…
删除区间行
- 删除第5行到最后一行,
'5,$d'
sed增加
-
a append 在指定行后面追加内容
-
i insert 在指定行上面插入一行
-
c replace 替换指定行的内容
-
i上方增加
准备工作:seq 5 >> seq
[root@wzyCentos ~]# sed '2i wzy' seq
1
wzy
2
- a行后增加
[root@wzyCentos ~]# sed '2a wzy' seq
1
2
wzy
3
- c替换指定行的内容,把第2行的2替换为wzy
[root@web~]# seq 3
1
2
3
[root@web~]# seq 3 | sed '2c wzy'
1
wzy
3
把selinux改为disabled
sed '7c SELINUX=Disabled' /etc/selinux/config
- w保存
把文件的的第4行保存为4w.txt
sed '4w 4w.txt' pass5
[root@qwert test]# cat 4w.txt
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
-e 多次编辑
第一次编辑:删除第二行wzy
内容
第二次编辑:把root替换为ROOT
[root@m01~]# echo -e "root\nwzy"
root
wzy
[root@m01~]# echo -e "root\nwzy"|sed -e '2d' -e 's#root#ROOT#g'
ROOT
sed '7c SELINUX=Disabled' /etc/selinux/config
- w保存
把文件的的第4行保存为4w.txt
sed '4w 4w.txt' pass5
[root@qwert test]# cat 4w.txt
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
-e 多次编辑
第一次编辑:删除第二行wzy
内容
第二次编辑:把root替换为ROOT
[root@m01~]# echo -e "root\nwzy"
root
wzy
[root@m01~]# echo -e "root\nwzy"|sed -e '2d' -e 's#root#ROOT#g'
ROOT