sed命令
sed
作用:
1.取行
2.删除行
3.替换行
4.增加内容
5.后向引用语法结构:
sed '模式+动作' file # 直接处理文件 效率比较高
cat file|sed '模式+动作' # 效率较低
其他命令的结果|sed 对显示到屏幕上的内容进行处理
模式: 找谁,按照行 模糊过滤查找文件内容
动作: 找到后干啥 显示 删除 替换 增加内容
【1】、sed查找功能
1、sed按照指定行查找
语法格式:
sed -n 'np' file # n为数字 p为print输出结果
参数选项:
-n # 取消默认输出
-r # 支持扩展正则
-i # 修改源文件
案例1:只显示文件中的第三行
[root@kylin-xu ~]# sed -n '3p' passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
案例2:显示文件的最后一行
[root@kylin-xu ~]# sed -n '$p' passwd
operator:x:11:0:operator:/root:/sbin/nologin
案例3:显示文件中的第3-第5行,使用逗号进行分隔
[root@kylin-xu ~]# sed -n '3,5p' passwd
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
案例4:显示文件第6行到最后一行
[root@kylin-xu ~]# sed -n '6,$p' passwd
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
案例5:查看/分区使用情况
[root@kylin-xu ~]# df -Th | sed -n '6p'
/dev/mapper/klas-root xfs 39G 3.7G 35G 10% /
2、模糊过滤查找内容
语法格式
sed -n '/过滤内容/动作' filename
参数:
-r:支持扩展正则
案例1:查找包含root的行
[root@kylin-xu ~]# sed -n '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
案例2:查找以root开头的行
[root@kylin-xu ~]# sed -n '/^root/p' passwd
root:x:0:0:root:/root:/bin/bash
案例3:查找以bash结尾的行
[root@kylin-xu ~]# sed -n '/bash$/p' passwd
root:x:0:0:root:/root:/bin/bash
案例4:查找以r开头或者h结尾的行
[root@kylin-xu ~]# sed -n '/b$|^r/p' passwd -r
root:x:0:0:root:/root:/bin/bash
案例5:以r或a开头的行
[root@kylin-xu ~]# sed -n '/^[ar]/p' passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
案例6:查找以bin开头的行到以adm开头的行,通过模糊匹配实现查找一段范围的行
[root@kylin-xu ~]# sed -n '/^bin/,/^adm/p' passwd
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
$ 注意:如果有多个满足结尾匹配的行,那么只匹配到第一个
[root@kylin-xu ~]# cat 1.txt
root xxxxxxxxxxxxxxxxx
123
adm qqqqqqqqqqqqqqqqqqqqqqqq
old cccccccccc
test uuuuuuuuuuu
adm oooooooooooooo
22222222222222
[root@kylin-xu ~]# sed -n '/^root/,/^adm/p' 1.txt
root xxxxxxxxxxxxxxxxx
123
adm qqqqqqqqqqqqqqqqqqqqqqqq
$如果找不到结尾则一直输出到文章结尾
[root@kylin-xu ~]# sed -n '/^root/,/^sasdasd/p' 1.txt
root xxxxxxxxxxxxxxxxx
123
adm qqqqqqqqqqqqqqqqqqqqqqqq
old cccccccccc
test uuuuuuuuuuu
adm oooooooooooooo
22222222222222
【2】、sed删除功能
语法结构:
sed '3d' filename
sed '/过滤内容/d' filename
sed '/正则表达式/d' filename
sed '//,//d' filename
默认临时的输出到屏幕上不修改源文件
想要修改源文件需要加-i参数
案例1:删除第三行,并不是真实删除
[root@kylin-xu ~]# sed '3d' 2.txt
11111
22222
44444
55555
[root@kylin-xu ~]# cat 2.txt
11111
22222
33333
44444
55555
案例2:真实删除源文件的第三行
[root@kylin-xu ~]# sed '3d' 2.txt -i
[root@kylin-xu ~]# cat 2.txt
11111
22222
44444
55555
案例3:删除2-4行
[root@kylin-xu ~]# sed '2,4d' 2.txt
11111
55555
案例4:删除root开头的行
[root@kylin-xu ~]# sed '/^root/d' passwd
案例5:删除以n结尾的行
[root@kylin-xu ~]# sed '/n$/d' passwd
案例6:删除以root开头的行到以adm开头的行
[root@kylin-xu ~]# sed '/^root/,/^adm/d' passwd
案例7:删除root或adm开头的行
[root@kylin-xu ~]# sed '/^adm|^root/d' passwd -r
笔试题 查找/删除日志中的时间范围
cat /var/log/secure | sed '/^Nov 6 00:05:07/,/^Nov 6 14:46:58/d'
【3】、sed修改功能
sed '3a' # 在第3行追加内容
sed '3i' # 在第3行插入内容
sed '3c' # 将第3行完全替换
sed '3w w.txt' # 将第3行保存到新文件中
案例1:在第3行的下面插入test
[root@kylin-xu ~]# sed '3a test' 2.txt
11111
22222
33333
test
44444
55555
案例2:在第三行插入hahaha
[root@kylin-xu ~]# sed '3i hahaha' 2.txt
11111
22222
hahaha
33333
44444
55555
案例3:将第三行完全替换位xixixi
[root@kylin-xu ~]# sed '3c hahaha' 2.txt
11111
22222
hahaha
44444
55555
案例4:修改sshd配置文件,修改端口号
[root@kylin-xu ~]# sed '17c Port 123' /etc/ssh/sshd_config -i
[root@kylin-xu ~]# grep "Port" /etc/ssh/sshd_config
Port 123
#GatewayPorts no
GatewayPorts no
案例5:修改selinux配置文件
[root@kylin-xu ~]# sed '/^SELINUX=/c SELINUX=permissive' /etc/selinux/config
案例6:将第三行保存到新文件
[root@kylin-xu ~]# sed '3w w.txt' 2.txt
11111
22222
33333
44444
55555
[root@kylin-xu ~]# cat w.txt
33333
【4】、sed替换功能
语法格式:
sed 's#替换谁#替换成谁#g' file
sed 's///g' file
sed 's@@@g' file
sed 'sAAAg' file
案例1:将root替换成heihei
sed 's/root/heihei/g' passwd
案例2:替换每行出现的第一个单词
sed 's#root#heihei#' passwd
案例3:替换文件中的:为-
sed 's#:#-#g' passwd
案例4:将:替换为空格
sed 's#:# #g' passwd
案例5:替换文件中的:和/ 为空格
sed 's#:|/# #g' passwd -r
sed 's#[:/]# #g' passwd
案例6: 替换文件中的a-Z为空格
[root@kylin-xu ~]# sed 's#[a-z]# #g' passwd -r
: :0:0: :/ :/ /
: :1:1: :/ :/ /
: :2:2: :/ :/ /
: :3:4: :/ / :/ /
: :4:7: :/ / / :/ /
: :5:0: :/ :/ /
: :6:0: :/ :/ /
: :7:0: :/ :/ /
: :8:12: :/ / / :/ /
: :11:0: :/ :/ /
案例7:删除a-z之外的所有内容
[root@kylin-xu ~]# sed 's#[^a-z]# #g' passwd -r
案例8:查询/etc/passwd文件中子母出现的次数
[root@kylin-xu ~]# sed 's#[^a-Z]##g' /etc/passwd | grep . -o | sort | uniq -c | sort -rn
模式+动作进行替换
查找就等于模式 查找后的动作是输出p
[root@oldboyedu ~]# sed -n '4p' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
将p动作修改为替换的动作
案例1:将第四行的nologin替换为bash
sed '4s#nologin#bash#g' passwd
案例2:将3-6行的x替换为A
sed '3,6s#x#A#g' passwd
案例3:查找包含root的行,将x替换为D
sed '/root/s#x#D#g' passwd
面试题:
将文件中的test替换为haha
sed 's#test#haha#g' -i
将3-5行进行注释
sed '3,5s/^/#/g' passwd
指定注释某行,注释adm开头的行
sed '/^root/s/^/#/g' passwd
【5】、sed后向引用
语法结构:
sed 's#(正则)#\1#g' # \1获取第一个括号中的内容 \2获取第2个括号中的内容
案例1:将想要的内容输出
[root@kylin-xu ~]# echo old test | sed 's#(old)( )(test)#\3\2\1#g' -r
test old
案例2:获取IP
ifconfig ens33 | sed '2p' -n | sed 's#(.*inet )([0-9.]+ )(.*)#\2#g' -r
192.168.121.99
案例3:创建用户
[root@kylin-xu ~]# echo test{1..3} | xargs -n1 | sed 's#(.*)#useradd \1#g' -r | bash
[root@kylin-xu ~]# id test1 test2 test3
用户id=12309(test1) 组id=12309(test1) 组=12309(test1)
用户id=12310(test2) 组id=12310(test2) 组=12310(test2)
用户id=12311(test3) 组id=12311(test3) 组=12311(test3)
扩展: 给每个用户配置密码
[root@kylin-xu ~]# echo test{1..3}| xargs -n1 | sed 's#(.*)#useradd \1 ;echo 0207xrzh! | passwd --stdin \1#g' -r | bash
useradd:用户“test1”已存在
更改用户 test1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 test2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 test3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
本文来自博客园,作者:Linux小菜鸟,转载请注明原文链接:https://www.cnblogs.com/xuruizhao/p/18544742