27_linux笔记-sed


个人博客
https://blog.csdn.net/cPen_web

sed是一种支持正则表达式的非交互式流编工具(stream editor)
脚本中修改文本或者文本替换的最佳工具

2个空间
		pattern space --> 处理数据的地方 --> 处理一行数据后,模式空间会清空
		hold space --> 临时存放数据的地方
	
		把pattern space放到hold space  命令:h、H
		把hold space放到pattern space  命令:g、G

#注:性能意识,sed在内存里运行,比磁盘速度快
#注:容量意识

sed的-i选项

示例:-i选项 直接在文件里进行修改,不输出到屏幕

[root@cPen_A lianxi]# sed -i 's/xiaomi/redmi/g' test.txt 

示例:通过管道传过来

[root@cPen_A lianxi]# cat chen |sed 's/xiaomi/redmi/g'
[root@cPen_A lianxi]# cat -n /etc/passwd|head |tail -6
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8	halt:x:7:0:halt:/sbin:/sbin/halt
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10	operator:x:11:0:operator:/root:/sbin/nologin

sed的-n选项

示例:-n选项 值显示匹配处理的行 (否则会输出所有)

[root@cPen_A lianxi]# cat -n /etc/passwd|sed -n '5,10p'
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8	halt:x:7:0:halt:/sbin:/sbin/halt
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10	operator:x:11:0:operator:/root:/sbin/nologin

p命令输出的时候

连续的行

[root@localhost lianxi]# cat /etc/passwd|sed -n '1,5p'

不连续的行

[root@localhost lianxi]# cat /etc/passwd|sed -n '10p;20p'

sed的p命令

sed -n ‘行号1,行号2p’ 输出文件

[root@localhost lianxi]# cat /etc/passwd|sed -n '1,5p'			#注:连续用,号
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
[root@localhost lianxi]# cat /etc/passwd|sed -n '=;1,5p'		#注:=;输出行号
1
root:x:0:0:root:/root:/bin/bash
2
bin:x:1:1:bin:/bin:/sbin/nologin
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4
adm:x:3:4:adm:/var/adm:/sbin/nologin
5
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6
7
……
14
[root@localhost lianxi]# cat -n /etc/passwd|sed -n '1,$p'		#注:$p最后一行
[root@localhost lianxi]# cat -n /etc/passwd|sed -n '5,+5p'		#注:第5行开始 往后加5行
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8	halt:x:7:0:halt:/sbin:/sbin/halt
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10	operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost lianxi]# cat -n /etc/passwd|sed -n '5,100!p'		#注:取反,取1到4行
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin

示例:步长值

cat -n /etc/passwd|sed -n '1~2p'
cat -n /etc/passwd|sed -n '2~2p'
[root@localhost lianxi]# cat -n /etc/passwd|sed -n '1~2p'	#注:单数行,1开始每次往后2行
     1	root:x:0:0:root:/root:/bin/bash
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    11	games:x:12:100:games:/usr/games:/sbin/nologin
    13	nobody:x:99:99:Nobody:/:/sbin/nologin
    15	dbus:x:81:81:System message bus:/:/sbin/nologin
    17	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    19	chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    21	chenpeng:x:1001:1001::/home/chenpeng:/bin/bash
    23	nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin
[root@localhost lianxi]# cat -n /etc/passwd|sed -n '2~2p'		#注:双数行
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
     8	halt:x:7:0:halt:/sbin:/sbin/halt
    10	operator:x:11:0:operator:/root:/sbin/nologin
    12	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    14	systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    16	polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    18	postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    20	mysql:x:1000:1000::/home/mysql:/sbin/nologin
    22	redis:x:997:995:Redis Database Server:/var/lib/redis:/sbin/nologin

shell变量传到sed里

示例:shell变量传到sed里

#双引号  推荐
[root@localhost lianxi]# num1=6
[root@localhost lianxi]# num2=10
[root@localhost lianxi]# cat -n /etc/passwd|sed -n "${num1},${num2}p"
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8	halt:x:7:0:halt:/sbin:/sbin/halt
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10	operator:x:11:0:operator:/root:/sbin/nologin
#单引号
[root@localhost lianxi]# cat -n /etc/passwd|sed -n ''${num1},${num2}'p'
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8	halt:x:7:0:halt:/sbin:/sbin/halt
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10	operator:x:11:0:operator:/root:/sbin/nologin

示例:显示包含bash的行

[root@localhost lianxi]# cat /etc/passwd|sed -n '/bash/p'
root:x:0:0:root:/root:/bin/bash
chenpeng:x:1001:1001::/home/chenpeng:/bin/bash
[root@localhost lianxi]# cat /etc/passwd|egrep "bash"
root:x:0:0:root:/root:/bin/bash
chenpeng:x:1001:1001::/home/chenpeng:/bin/bash
[root@localhost lianxi]# cat /etc/passwd|awk '/bash/'
root:x:0:0:root:/root:/bin/bash
chenpeng:x:1001:1001::/home/chenpeng:/bin/bash

示例:输出#号开头的行

[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -n '/^#/p'

示例:输出不是#号开头的行

[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -n '/^#/!p'

示例:显示 不是#号和!号开头的行

[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -r -n '/^#|^$/!p'	#注:-r支持更多正则
[root@localhost lianxi]# cat /etc/ssh/ssh_config |egrep -v '^#|^$'

示例:显示 以/结尾的行

[root@localhost lianxi]# df -h|egrep "/$"
/dev/mapper/centos-root   17G  9.9G  7.2G   58% /
[root@localhost lianxi]# df -h|sed -n '/\/$/p'
/dev/mapper/centos-root   17G  9.9G  7.2G   58% /

示例:以a-Z开头的行

[root@localhost lianxi]# cat /etc/passwd|sed -n '/^[a-Z]/p'

示例:不以a-Z开头的行

[root@localhost lianxi]# cat /etc/passwd|sed -n '/^[^a-Z]/p'

题目:截取nginx的access.log文件里3月18号15:30:00 – 16:48:10时间段内的所有访问日志

[root@cPen_A lianxi]# service firewalld stop	#注:立马停止firewalld服务
[root@cPen_A lianxi]# systemctl disable firewalld	#注:设置firewalld服务开机不启动-->下次重启机器的时候不启动

[root@cPen_A nginx]# tail -f access.log		#注:动态监控最后一行
192.168.0.17 - - [09/Jan/2021:16:36:03 +0800] "GET /favicon.ico HTTP/1.1" 404 3650 "http://192.168.0.118/" "Mozilla/5.0 (Linux; Android 10; PCT-AL10; HMSCore 5.1.0.300; GMSCore 20.26.14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 HuaweiBrowser/11.0.5.304 Mobile Safari/537.36" "-"
[root@cPen_A nginx]# pwd
/var/log/nginx				#注:nginx的日志文件的路径
[root@cPen_A nginx]# ls
access.log  access.log-20201202.gz  error.log  error.log-20201202.gz
#注:access.log是nginx的访问日志文件,记录访问过我们的网站的信息
[root@cPen_A nginx]# cat access.log | awk -F'[()]' '{print $2}'|sort|uniq -c|sort -nr
     13 Windows NT 10.0; WOW64			#注:排序去重 再降序排序 显示数量
      4 Linux; Android 10; PCT-AL10; HMSCore 5.1.0.300; GMSCore 20.26.14
[09/Jan/2021:16:32:46 +0800] --> 09/Jan/2021:16:32:46
[09/Jan/2021:16:33:07 +0800] --> 09/Jan/2021:16:32:46

示例:查找该时间段的所有访问日志

[root@cPen_A nginx]# cat access.log|sed -n '/09\/Jan\/2021:16:32:46/,/09\/Jan\/2021:16:33:07/p'

示例:正则写法

[root@cPen_A nginx]# cat access.log|sed -r -n '/09\/Jan\/2021:16:(3[789]|4[0-9]|5[01]):(0[1-9]|[1-5][0-9])/p'

sed的d命令

删除操作可以根据行号和匹配模式进行操作

示例:删除有denghui的行

[root@cPen_A nginx]# cat /etc/passwd|sed '/denghui/d'

示例:-i动原文件 删除有redmi这行

[root@cPen_A lianxi]# sed -i '/redmi/d' test.txt 

示例:根据行删除

[root@cPen_A lianxi]# sed -i '2d' test.txt 	#注:删除第2行

sed的查找方式

sed查找方式:
1、根据行号
2、根据模式 -->正则表达式=字符+特殊符号
3、根据字符串

示例:在第4行后面追加huawei

[root@cPen_A lianxi]# sed -i '4a huawei' test.txt 

示例:在第4行前面插入apple

[root@cPen_A lianxi]# sed -i '4i apple' test.txt 

示例:在VIVO这行前一行插入OPPO

[root@cPen_A lianxi]# sed -i '/VIVO/i OPPO' test.txt 

示例:在VIVO同行后面添加APPLE.&表示前面全部

[root@cPen_A lianxi]# sed -i 's/VIVO/& APPLE/' test.txt 

示例:将所有为huawei都替换成sanchuang

[root@cPen_A lianxi]# sed -i 's/huawei/sanchuang/g' test.txt 

sed的c命令

示例:sed的整行替换 c

[root@cPen_A 10]# cp /etc/sysconfig/selinux .
[root@cPen_A 10]# sed -i '/^SELINUX=/c SELINUX=disabled' selinux 
[root@cPen_A 10]# cp /etc/ssh/sshd_config .
[root@cPen_A 10]# sed -i '/^#Port/c Port 2233' sshd_config 
[root@cPen_A 10]# cat sshd_config |grep Port
Port 2233
#注:对文件的修改  用sed比较好
[root@cPen_A 10]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 .		#注:网卡配置文件
[root@cPen_A 10]# vim ifcfg-ens33 
BOOTPROTO="none"					#注:none 静态配置ip地址	dhcp动态获得ip
NAME="ens33"						#注:网卡连接的名字
UUID="831f1350-14c2-46db-bf53-1937c5feb8f5"	#注:网卡的设备编号的唯一值
DEVICE="ens33"					#注:网卡设备的名字
ONBOOT="yes"						#注:开机的时候是否激活  yes表示激活启动  no禁用
IPADDR="192.168.0.38"				#注:ip地址
NETMASK=255.255.255.0				#注:子网掩码
GATEWAY=192.168.0.1				#注:默认网关		路由器的接口地址
DNS1=192.168.0.1					#注:首选dns服务器
DNS2=114.114.114.114				#注:备用dns服务器

sed的w命令

sed的w命令 写入文件

示例:把以#开头的行 不写到文件里

[root@cPen_A 10]# sed '/^#/!w a.txt' selinux 
[root@cPen_A 10]# cat selinux |sed '/^#/!w abc.txt'
[root@cPen_A 10]# cat a.txt 
SELINUX=disabled
SELINUXTYPE=targeted 

sed的s命令

sed的替换 -->核心功能

[root@cPen_A 10]# sed -i 's/xiaomi/redmi/' phone.txt 	#注:替换每一行的第1个xiaomi替换为redmi
[root@cPen_A 10]# sed -i 's/vivo/nokia/2' phone.txt 	#注:替换每一行的第2个vivo替换为nokia
[root@cPen_A 10]# sed -i 's/oppo/meizu/g' phone.txt 	#注:每一行所有的oppo替换为meizu
[root@cPen_A 10]# sed -i 's/xiaomi/redmi/2g' phone.txt #注:替换每一行的第2个后所有xiaomi全部替换为redmi
[root@cPen_A 10]# sed -i '/^ONBOOT/ s/yes/no/' ifcfg-ens33 	#注:查找替换 (局部替换)
[root@cPen_A 10]# sed -i '8 s/192.168.0.1/192.168.0.2/' ifcfg-ens33 	#注:根据 行号替换 (局部替换)
[root@cPen_A 10]# sed -i '8 s/GATEWAY.*/GATEWAY=192.168.0.2/' ifcfg-ens33 	#注:整行替换

示例:把所有apple删除 --> 删除部分字符串

[root@cPen_A 10]# sed -i 's/apple//g' phone.txt 		#注:拿空的去替换它
\n  换行
\t  tab
[root@cPen_A 10]# sed -i 's/s/\t/g' phone.txt 
[root@cPen_A 10]# sed -i '1c sanchuang' /etc/hostname 
[root@cPen_A 10]# sed -i '3,5s/^/#/' phone.txt 	#注:3-5行加注释
[root@cPen_A 10]# sed -i '3,5s/$/ sanchuang/' phone.txt 	#注:3-5行 末尾加sanchuang
[root@cPen_A 10]# sed -i '/^DNS2/ s/^/#/' ifcfg-ens33 		#注:注释
#DNS2=114.114.114.114

模式空间(pattern space)和暂存空间(hold space)相关的命令

模式空间(pattern space)和暂存空间(hold space)相关的命令:

n 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条处理命令而非第一条命令。
N 读入下一行,追加到模式空间行后面,此时模式空间有两行。
h 把模式空间里的行拷贝到暂存空间。
H 把模式空间里的行追加到暂存空间。
g 用暂存空间的内容替换模式空间的行。
G 把暂存空间的内容追加到模式空间的行后。
x 将暂存空间的内容于模式空间里的当前行互换。
! 对所选行以外的所有行应用命令。
参考博客
http://blog.csdn.net/itsenlin/article/details/21129405

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mycpen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值