day014-Linux基础-三剑客sed

6次阅读
没有评论

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
正文完
 0
评论(没有评论)