2026年3月25日
知识点回顾
正则表达式
1.普通正则
^ #表示以什么什么开头
grep '^a' a.txt #查找以a开头的行
$ #以什么什么结尾
grep "z$" a.txt #查找以结尾的行
. 表示任意单个字符
grep "." a.txt #匹配所有字符
* #表示任意次
grep 'a*' a.txt #匹配 a 出现次数 0或无数次
[] #表示选一个任意单字
grep '[abc]' a.txt #表示匹配a或b或c
2.扩展正则
+ #作用是最少一次
grep 'a+' a.txt #匹配a 条件最少一次
| #或者
grep 'a|b' a.txt #匹配a或b
{} #作用指定次数
grep '8{2,4}' a.txt #匹配出现次数最少2,最多4 的8数字
() #一个整体
grep '(a|b)' a.txt #作为一个整体匹配
\b
grep -i
grep -v
grep -E
grep -n
[^]
扩展补充:
不加引号 可以解析变量
单引号 所见即所得
双引号 可以解析变量
01.sed
作用:三剑客老二
1.模糊过滤 和 grep相同
2.取行
3.格式化输出(后向引用)
4.sed增删查改
5.替换
6.处理文本 1-10 反过来10 9 8..1
--------------
sed 总结
语法结构:
sed [参数] '找谁动作' file
参数:
-n #取消默认输出
-i #修改原文件
-r #扩展正则
找谁:
#1.按行号:直接写数字,$是最后一行
#2.按内容:/关键词/
#3.区间:开始,结束(行号或内容都行)
#4.排除:加!
#5.多条件:用;分开
动作:
p #输出 print 打印
d #删除 delete 删除
s///g #替换 s单个替换substitute g全局替换
----------------------------
3i #insert 插入
3a #append 追加
3c #change 替换
3w #write 写入
1.sed取行
作用:指定行直接输出 正则在直接取行不适用
语法结构:
sed 'np' file #指定输出第n行 n数字 直接输出第几行
sed -n '3p' file #取消默认输出
案例1:输出文件第三行
[root@oldboy ~]# sed '3p' b.txt
aaaa
bbbb
cccc
cccc
dddd
-----------
#取消默认输出 -n
[root@oldboy ~]# sed -n '3p' b.txt
cccc
案例2:找出文件的第二行
[root@oldboy ~]# sed -n '2p' b.txt
bbbb
案例3:找出文件的第2行和第5行 不能用管道|
[root@oldboy ~]# sed -n '2p;5p' b.txt
bbbb
cccc
案例4:找出文件的最后一行
[root@oldboy ~]# sed -n '$p' b.txt
cccc
案例5:输出文件的第3到5行
[root@oldboy ~]# sed -n '3,5p' b.txt
cccc
dddd
cccc
2.sed模糊过滤
作用:模糊过滤文件的内容 支持正则
sed -n '//p' file #print 打印输出到屏幕
sed -n '/找谁/干啥' file
sed -r 支持扩展正则
找谁:直接取行、模糊过滤
干啥:p打印 d删除
注意:-n和p动作俩一起的,有n就有p,有p就有n
案例1:查找出包含Linux的行
[root@oldboy ~]# sed -n '/linux/p' oldboy.txt
I teach linux.
案例2:查找出包含查找出m结尾的行
[root@oldboy ~]# sed -n '/m $/p' oldboy.txt
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
案例3:找出包含Linux或者test的行
[root@oldboy ~]# sed -n '/linux|test/p' oldboy.txt -r
I teach linux.
test
案例3:找出df -h结果以/结尾的行
[root@oldboy ~]# df -h | sed -n '/\/$/p'
/dev/sda3 48G 14G 35G 29% /
案例4:找出以sda3开头的行
[root@oldboy ~]# df -h | sed -n '/^\/dev\/sda3/p'
/dev/sda3 48G 14G 35G 29% /
案例5:找出包含sda3的行
[root@oldboy ~]# df -h | sed -n '/sda3/p'
/dev/sda3 48G 14G 35G 29% /
案例6:找出以t或者d开头的行
[root@oldboy ~]# df -h | sed -n '/^[td]/p'
devtmpfs 963M 0 963M 0% /dev
tmpfs 979M 0 979M 0% /dev/shm
tmpfs 979M 22M 958M 3% /run
tmpfs 979M 0 979M 0% /sys/fs/cgroup
tmpfs 979M 0 979M 0% /tmp
tmpfs 196M 0 196M 0% /run/user/0
----------------------------------
#取反 非t或d开头的行
[root@oldboy ~]# df -h | sed -n '/^[^td]/p'
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 48G 14G 35G 29% /
/dev/sda1 195M 139M 56M 72% /boot
案例7:过滤出test开头到my结尾的 注意开头和结尾
[root@oldboy ~]# cat oldboy.txt
vim oldboy.txt
I am lizheaya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
my qq num is 593528156
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
-------------
[root@oldboy ~]# sed -n '/test/,/my/p' oldboy.txt
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
案例8:有头没尾
[root@oldboy ~]# sed -n '/test/,/my/p' oldboy.txt
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
test #如果找到了头没有尾输出向下所有的行
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
案例9:企业案例、取出时间的区间范围进行去重统计
取出凌晨1点到上午10点的区间进行统计
[root@oldboy ~]# cat >>1.txt<<EOF
> 00:05 get www.oldboy.com/index.html 200 ok size 203k
> 00:12
> 00:16
> 01:44
> 02:23
> ...
> 09:58
> 10:03
> 11:34
> 17:00
> EOF
-------------
[root@oldboy ~]# sed -n '/01:44/,/10:03/p' 1.txt #按照字符串范围来过滤
01:44
02:23
...
09:58
10:03
3.sed删除
作用:删除文件中的某行
语法结构:
sed '3d' file #删除第3行、输出其他行 临时删除没有修改原文件
sed '//d' file #删除模糊过滤到内容的行
sed -i '3d' file #修改源文件-i
案例1:删除第3行
[root@oldboy ~]# cat b.txt
aaaa
bbbb
cccc
dddd
cccc
[root@oldboy ~]# sed '3d' b.txt
aaaa
bbbb
dddd
cccc
案例2.修改原文件需要加-i参数
[root@oldboy ~]# sed -i '3d' b.txt
[root@oldboy ~]# cat b.txt
aaaa
bbbb
dddd
cccc
案例3:删除文件第3到第5行
[root@oldboy ~]# cat b.txt
aaaa
ssss
bbbb
dddd
cccc
[root@oldboy ~]# sed '3,5d' b.txt
aaaa
ssss
案例4:删除第2和第4行
[root@oldboy ~]# cat b.txt
aaaa
ssss
bbbb
dddd
cccc
[root@oldboy ~]# sed '2d;4d' b.txt
aaaa
bbbb
cccc
案例5:删除包含aa的行
[root@oldboy ~]# cat b.txt
aaaa
ssss
bbbb
dddd
cccc
[root@oldboy ~]# sed '/aa/d' b.txt
ssss
bbbb
dddd
cccc
案例6:删除包含aa或者dd的行
[root@oldboy ~]# sed -r '/aa|dd/d' b.txt
ssss
bbbb
cccc
案例7:删除包含bb到dd的行
[root@oldboy ~]# cat b.txt
aaaa
ssss
bbbb
dddd
cccc
[root@oldboy ~]# sed -n '/bb/,/dd/p' b.txt
bbbb
dddd
[root@oldboy ~]# sed '/bb/,/dd/d' b.txt
aaaa
ssss
cccc
案例8:删除bb到文件的结尾
[root@oldboy ~]# sed '2,$d' b.txt
aaaa
4.sed增加内容
语法结构:
sed '3i 字符串' #在第三行增加内容
sed '3a 字符串' #在第三行下一行插入内容
sed '3c 字符串' #修改第三行
sed '3w file'
案例1:在第3行处增加hehe字符串
[root@oldboy ~]# cat b.txt
aaaa
ssss
bbbb
dddd
cccc
[root@oldboy ~]# sed '3i hehe' b.txt
aaaa
ssss
hehe
bbbb
dddd
cccc
案例2:在第3行下一行插入hehe
[root@oldboy ~]# cat b.txt
aaaa
ssss
bbbb
dddd
cccc
[root@oldboy ~]# sed '3a hehe' b.txt
aaaa
ssss
bbbb
hehe
dddd
cccc
案例3:将第3行修改为hehe
[root@oldboy ~]# cat b.txt
aaaa
ssss
bbbb
dddd
cccc
[root@oldboy ~]# sed '3c hehe' b.txt
aaaa
ssss
hehe
dddd
cccc
案例4:将第三行保存到新文件中t.txt
[root@oldboy ~]# sed '3w 1.txt' b.txt
aaaa
ssss
bbbb
dddd
cccc
[root@oldboy ~]# cat 1.txt
bbbb
企业案例:替换整行
[root@oldboy ~]# sed -i '8c SELINUX=disabled' /etc/selinux/config
[root@oldboy ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
#SELINUX=disabled
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# ukmls - Multi Level Security protection.
# ukmcs -ukmcs variants of the SELinux policy.
#SELINUXTYPE=targeted
SELINUXTYPE=targeted
# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0
5.sed 替换
语法格式:
sed 's#替换谁#换成谁#g' file #替换文件中所有的包含xxx的 默认处理所有行
sed 's///g' file
sed 's@@@g' file
'sAAAg' file
sed 's###' file #替换每行第一个出现的单词为xx
案例1:将文件中的root替换成oldboy
[root@oldboy ~]# sed 's#root#oldboy#g' n1.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
案例2:将文件中的冒号替换成空格
[root@oldboy ~]# sed 's#:# #g' n1.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
案例3:替换文件中的
[root@oldboy ~]# cat n1.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
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#替换成空格
[root@oldboy ~]# sed 's#\## #g' n1.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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#删除
[root@oldboy ~]# sed 's#\###g' n1.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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
-------------
其他方式处理相同格式
[root@oldboy ~]# sed 's/#//g' n1.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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例4:替换文件中的#:/为空格
[root@oldboy ~]# sed 's/[#/:]/ /g' n1.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
adm x 3 4 adm var adm sbin nologin
lp x 4 7 lp var spool lpd sbin nologin
----
或使用管道
[root@oldboy ~]# sed -r 's#/|:# #g' n1.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
#adm x 3 4 adm var adm sbin nologin
#lp x 4 7 lp var spool lpd sbin nologin
------------------
#替换文件中的root或者bin为AA
[root@oldboy ~]# sed -r 's#root|bin#AA#g' n1.txt
AA:x:0:0:AA:/AA:/AA/bash
AA:x:1:1:AA:/AA:/sAA/nologin
daemon:x:2:2:daemon:/sAA:/sAA/nologin
adm:x:3:4:adm:/var/adm:/sAA/nologin
#adm:x:3:4:adm:/var/adm:/sAA/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sAA/nologin
---------
边界符
[root@oldboy ~]# sed -r 's#root|\bbin\b#AA#g' n1.txt
AA:x:0:0:AA:/AA:/AA/bash
AA:x:1:1:AA:/AA:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例5:替换第2行的bin为A
找谁替换: sed '找谁动作' file
找谁:指定行、行的区间
找谁:模糊过滤、区间范围
[root@oldboy ~]# sed '2s#bin#A#g' n1.txt
root:x:0:0:root:/root:/bin/bash
A:x:1:1:A:/A:/sA/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例6:替换第2行-5行的bin为A
[root@oldboy ~]# sed '2,5s#bin#A#g' n1.txt
root:x:0:0:root:/root:/bin/bash
A:x:1:1:A:/A:/sA/nologin
daemon:x:2:2:daemon:/sA:/sA/nologin
adm:x:3:4:adm:/var/adm:/sA/nologin
#adm:x:3:4:adm:/var/adm:/sA/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例7:替换包含root行的bin为A
[root@oldboy ~]# sed '/root/s#bin#A#g' n1.txt
root:x:0:0:root:/root:/A/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
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例8:替换包含root或者adm行的bin为A
[root@oldboy ~]# sed -r '/root|adm/s#bin#A#g' n1.txt
root:x:0:0:root:/root:/A/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sA/nologin
#adm:x:3:4:adm:/var/adm:/sA/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例9:只替换每行的第一个root为A(了解)
[root@oldboy ~]# sed 's#root#A#' n1.txt
A: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
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例10:将文件中的3-8行进行注释
[root@oldboy ~]# sed '3,8s/^/#/g' n1.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
##adm:x:3:4:adm:/var/adm:/sbin/nologin
##lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例11:统计passwd中单词数量
[root@oldboy ~]# cat n1.txt |sed 's#[#:/0-9]# #g'|xargs -n1|sort|uniq -c|sort -rn
6 x
6 sbin
6 adm
5 nologin
4 bin
3 var
3 root
2 lp
2 daemon
1 spool
1 lpd
1 bash
案例12:vim操作将文件中的3-8行进行注释
vim快操作:
vim 1.txt 进入文件
按ctrl+v进入快模式
然后键盘的上下按钮选择处理的行
然后按I 输入要增加的内容
完成后按两下ESC
最后保存退出
vim替换进入底行模式
:s///g # 替换光标行的xx为xx
:%s///g # 替换所有的全局替换
重点总结
1.sed取行
sed -n '3p'
sed -n '3,5p'
sed -n '3,$p'
2.sed 模糊过滤 支持正则
sed -n '/字符串/p'
sed -n '/^a/p'
sed -n '/[ad]$/p'
sed -n '//,//p' #区间范围
3.sed删除
sed '3d' file
sed '3,5d' file
sed '/root/d' file
sed -r '/root|adm/d' file
sed '/xx/,/xx/d' file
4.sed 增加内容 笔记
sed '3i'
sed '3a'
sed '3c'
sed '3w file' file
5.sed替换
sed 's###g'
sed '2s###g'
sed '2,5s###g'
sed '/root/s###g'
vim快模式操作ctrl+v x删除选择 可以I输入内容
vim中替换:%s///g
grep
下次内容:
awk
正文完