sed作用: 过滤(类似grep) 替换 修改 格式化输出
语法结构:
sed'模式 动作'filesed'找谁 干啥'file
三剑客都支持处理屏幕上显示的信息
ip a|sed'找谁 干啥'
参数选项:
-n 取消默认输出
模式: 查找文件的字符串的行 怎么找
动作: 找到内容后的动作 增删改查
p # print 输出 打印[root@oldboy:~]# cat -n oldboy.txt1 I am lizhenya teacher!2 I teach linux.
3test45 I like badminton ball ,billiard ball and chinese chess!6 my blog is http: blog.51cto.com
7 our site is http:www.lizhenya.com
8 my qq num is 593528156910 aaaa,
11 not 572891888887.
12 ^^^^^^^^66$$$$$$$^^^$$13 lizhenyalizhenyalizhenya
sed 指定行查找。
案例1.sed按照行查找
[root@oldboy:~]# sed -n '3p' oldboy.txttest
案例2.sed输出最后一行 $
[root@oldboy:~]# sed -n '$p' oldboy.txt
lizhenyalizhenyalizhenya
案例3.区间范围使用逗号,表示区间范围
[root@oldboy:~]# sed -n '3,5p' oldboy.txttest
I like badminton ball ,billiard ball and chinese chess!
案例4.sed输出10到最后一行
[root@oldboy:~]# sed -n '10,$p' oldboy.txt
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
2.sed 模糊过滤
作用: 过滤文件中的字符串 类似grep
支持正则:
语法结构:grep '字符串'filesed-n'/字符串/p'filesed-n'/[xxx]/p'file
案例1.查找包含root的行
[root@oldboy:~]# head -3 /etc/passwd > p.txt[root@oldboy:~]# sed -n '/root/p' p.txt
root:x:0:0:root:/root:/bin/bash
案例2.查找包含bash的行
[root@oldboy:~]# sed -n '/bash/p' p.txt
root:x:0:0:root:/root:/bin/bash
案例3.使用正则,查找以r开头的行
[root@oldboy:~]# sed -n '/^r/p' p.txt
root:x:0:0:root:/root:/bin/bash
案例4.查找以n结尾的行
[root@oldboy:~]# sed -n '/n$/p' p.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
案例5.查找包含root或者sync的行
[root@oldboy:~]# sed -rn '/root|sync/p' p.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
operator:x:11:0:operator:/root:/sbin/nologin
案例6.查找包含或a 或b 或 c的行
[root@oldboy:~]# sed -rn '/[abc]/p' p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
或者使用|[root@oldboy:~]# sed -rn '/a|b|c/p' p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
案例7.查找字符串的区间范围使用逗号,查找adm和sync中间的行
sed-n'3,5p'filesed-n'/amd/,/sync/p'[root@oldboy:~]# sed -n '/adm/,/sync/p' p.txt
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
[root@oldboy:~]# sed -n '/^adm/,/^sync/p' p.txt
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
匹配区间范围注意:
唯一的字符串
1.如果有两个结尾,则只匹配到第一个结尾终止。
2.如果只有开头,没有匹配到结尾,则输出开头到文件末尾
案例: 匹配时间昨天1小时的数据。把时间作为字符串来匹配
[root@linuxnc ~]# sed -n '/2024:09:07:12/,/2024:09:57:53/p' /var/log/nginx/access.log
3.sed 删除
语法结构: sed'3d'file[root@oldboy:~]# cat 33.txt111111112222222222test33333333
oldboy
oldgirl 222
案例1.指定行删除
[root@oldboy:~]# sed '3d' 33.txt11111111222222222233333333
oldboy
oldgirl 222
案例2.删除第3-5行
[root@oldboy:~]# sed '3,5d' 33.txt111111112222222222
oldgirl 222
删除第3行-末尾
[root@oldboy:~]# sed '3,$d' 33.txt
案例3.删除模糊过滤的行
[root@oldboy:~]# sed '/oldboy/d' 33.txt111111112222222222test33333333
oldgirl 222[root@oldboy:~]# sed -r '/test|oldboy/d' 33.txt11111111222222222233333333
oldgirl 222
案例4.删除区间范围test和oldboy之间的行
[root@oldboy:~]# sed '/test/,/oldboy/d' 33.txt111111112222222222
oldgirl 222
4.sed 增加内容
语法结构:
sed'3c hehe'file# 将第3行替换成hehe # 掌握sed'3i test'file# 在第3行出插入test字符串sed'3a test'file# 在第3行的下面追加test字符串
案例: 将第3行替换成hehe
[root@oldboy:~]# sed '3c hehe' p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
hehe
adm:x:3:4:adm:/var/adm:/sbin/nologin
案例2.在第3行插入test字符串
[root@oldboy:~]# sed '3i test' p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
test
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
案例3.在第3行处追加test字符串
[root@oldboy:~]# sed '3a test' p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
test
adm:x:3:4:adm:/var/adm:/sbin/nologin
5.sed 替换
语法结构:
sed's#root#oldboy#g'file# 将文件中所有的root替换成oldboysed's///g'filesed's@@@g'file
案例1.将root替换为oldboy
[root@oldboy:~]# sed 's#root#oldboy#g' p.txt
oldboy:x:0:0:oldboy:/oldboy:/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:/oldboy:/sbin/nologin
案例2.只替换行里的第一个root为oldboy
[root@oldboy:~]# sed 's#root#AAA#' p.txt
AAA:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
案例3.将开头替换成# 批量注释[root@oldboy:~]# sed 's/^/#/g' p.txt#root: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:/root:/sbin/nologin
模式+动作
语法格式:
sed ‘3s###g’ filesed-n'3p'file# 指定行查找,有n就有p。没p就没nsed'3s###g'file# 模式+动作sed'/root/s###g'# 模式+动作
案例1.将第3行的a 替换成A
[root@oldboy:~]# sed '3s#a#A#g' p.txt
dAemon:x:2:2:dAemon:/sbin:/sbin/nologin
或者:
[root@oldboy:~]# sed -n '3s#a#A#gp' p.txt
dAemon:x:2:2:dAemon:/sbin:/sbin/nologin
案例2.第3-5行小a替换成A
[root@oldboy:~]# sed '3,5s#a#A#g' p.txt
root: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
案例3.将包含root的行 将bash 替换成test
[root@oldboy:~]# sed '/root/s#bash#test#g' p.txt
root:x:0:0:root:/root:/bin/test
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
案例4.只替换bin为test
[root@oldboy:~]# cat p.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
边界符
[root@oldboy:~]# sed '2s#\<bin\>#test#g' p.txt
root:x:0:0:root:/root:/bin/bash
test:x:1:1:test:/test:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
永久替换文件内容加参数 -i[root@oldboy:~]# sed -i 's#root#AAA#g' p.txt[root@oldboy:~]# cat p.txt
AAA:x:0:0:AAA:/AAA:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
案例5.替换p.txt中所有的字符
[root@oldboy:~]# sed 's#[a-z]##g' p.txt
AAA::0:0:AAA:/AAA://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://
::5:0::/://
::6:0::/://
::7:0::/://
::8:12::///://
::11:0::/AAA://
[root@oldboy:~]# sed 's#[a-Z]##g' p.txt # 小a-z 大A-Z[root@oldboy:~]# sed 's#[0-Z]##g' p.txt # 0-9 a-z A-Z[root@oldboy:~]# sed 's#[:/0-9]# #g' p.txt |xargs -n1|sort |uniq -c|sort -rn|head12 sbin
10 x
6 nologin
5 bin
4 AAA
3 var
3sync3shutdown3 mail
3halt
注意: -在中括号写到量变,如果在两个符号的中间报错,表示区间。
[root@oldboy:~]# sed 's#[-:/]# #g' p.txt |xargs -n1|sort |uniq -c|sort -rn|head12 sbin
10 x
6 nologin
60