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:所有的身份验证令牌已经成功更新。
posted @ 2024-11-13 20:39  Linux小菜鸟  阅读(40)  评论(0编辑  收藏  举报