标签搜索

Linux三剑客【grep、sed、awk】-02

lilymaxyz
2024-07-18 / 0 评论 / 37 阅读 / 正在检测是否收录...

Linux三剑客【grep、sed、awk】-02

1. 💓grep文本搜索工具

语法结构:参数选项

参数选项注释说明
-w精确匹配整词
-v取反
-E扩展正则
-i忽略大小写
-r递归过滤文件内容
-l只显示符合匹配条件的文件名
-n显示匹配内容的行号
-c只显示匹配的行数
-o匹配过程
-A过滤内容,往下显示n行
-B过滤内容,往上显示n行
-C过滤内容,上下各显示n行

2. 💓sed:批量编辑文本文件

2.1. sed的作用

sed是取行、修改、过滤和替换文本内容的强大工具。常用功能有对文件实现快速的增删改查。

2.2. sed命令的语法及参数

语法格式:参数选项:

参数选项注释说明参数选项注释说明
-n取消默认sed输出,常与p连用-r支持扩展正则
-i直接修改文件内容-e支持多次修改

动作参数:

动作参数注释说明动作参数注释说明
a增加pprint,打印匹配行内容
d删除s替换
i插入g全局

2.2.1. sed增删改查——查找行

案例实践:

环境准备:
[root@linux:~]# cat -n test.txt 
     1    I am lizhenya teacher!
     2    I teach linux.
     3    test
     4        
     5    I like badminton ball ,billiard ball and chinese chess!
     6    my blog is http: blog.51cto.com 
     7    our site is http:www.lizhenya.com 
     8    my qq num is 593528156
     9        
    10    aaa,
    11    not 572891888887.

案例1.sed输出第三行
[root@linux:~]# sed -n '3p' test.txt 
test

案例2.sed输出最后一行
[root@linux:~]# sed -n '$p' test.txt 
not 572891888887.

案例3.sed输出第3~5行
[root@linux:~]# sed -n '3,5p' test.txt 
test
    
I like badminton ball ,billiard ball and chinese chess!

案例4.sed输出第10行到最后一行
[root@linux:~]# sed -n '10,$p' test.txt 
aaa,
not 572891888887.

2.2.2. sed增删改查——查找字符串

作用:过滤文件的字符串

语法结构:

sed -n '/字符串/p' 文件

sed -n '/[字符串]/p' 文件

案例实践:

环境准备:
[root@linux:~]# head -10 /etc/passwd >passwd.txt
[root@linux:~]# cat -n passwd.txt 
     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    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

案例1.查找passwd.txt中包含root的行
[root@linux:~]# sed -n '/root/p' passwd.txt 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

案例2.查找passwd.txt中包含bash的行
[root@linux:~]# sed -n '/bash/p' passwd.txt 
root:x:0:0:root:/root:/bin/bash

案例3.使用正则,查找以r开头的行
[root@linux:~]# sed -n '/^r/p' passwd.txt 
root:x:0:0:root:/root:/bin/bash

案例4.查找以n结尾的行
[root@linux:~]# sed -n '/n$/p' passwd.txt 
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

案例5.查找包含root或者sync的行
[root@linux:~]# sed -rn '/root|sync/p' passwd.txt 
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
operator:x:11:0:operator:/root:/sbin/nologin

案例6.查找包含或a 或b 或 c的行
[root@linux:~]# sed -rn '/a|b|c/p' passwd.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
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

案例7.查找字符串的区间范围使用逗号,查找adm和sync中间的行
[root@linux:~]# sed -rn '/adm/,/sync/p' passwd.txt 
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

匹配区间范围注意:

(1)如果有两个结尾只匹配到第一个结尾终止

(2)如果只有开头,没有匹配到结尾,则输出开头到文件末尾

2.2.3. sed增删改查——删除

实践案例:

环境准备:
[root@linux:~]# cat -n a.txt 
     1    111111
     2    222222
     3    333333
     4    444444
     5    555555
     6    666666

案例1.指定行删除
[root@linux:~]# sed '3d' a.txt 
111111
222222
444444
555555
666666

案例2.删除3~5行
[root@linux:~]# sed '3,5d' a.txt
111111
222222
666666

2.2.4. sed增删改查——增加

语法结构:

sed '3c test' file #将第三行替换成test

sed '3i test ' file #在第三行处插入test字符串

sed '3a test' file #在第三行的下面追加test字符串

实践案例:

环境准备:
[root@linux:~]# cat -n passwd.txt 
     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    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

案例: 将第3行替换成test
[root@linux:~]# sed '3c test' passwd.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
test
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
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

案例2.在第3行插入test字符串
[root@linux:~]# sed '3i test' passwd.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
test
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
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

案例3.在第3行处追加test字符串
[root@linux:~]# sed '3a test' passwd.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
test
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
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

2.2.5. sed增删改查——替换

语法结构:

sed 's#root#xiaozhou #g' file

sed 's///g' file

sed 's@@@g' file

实践案例:

环境准备:
[root@linux:~]# cat -n passwd.txt 
     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    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

案例1.将root全部替换为xiaozhou
[root@linux:~]# sed 's#root#xiaozhou#g' passwd.txt 
xiaozhou:x:0:0:xiaozhou:/xiaozhou:/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
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:/xiaozhou:/sbin/nologin

案例2.将文件开头全部替换成#   “批量注释”
[root@linux:~]# sed 's/^/#/g' passwd.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
#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

案例3.只替换每行的第一个root为xiaozhou
[root@linux:~]# sed 's/root/xiaozhou/' passwd.txt 
xiaozhou:x:0:0:root:/root:/bin/bash

案例4.将第三行的a替换为A
[root@linux:~]# sed '3s/a/A/g' passwd.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

案例5.第3-5行小a替换成A
[root@linux:~]# sed '3,5s/a/A/g' passwd.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
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

案例6.将包含root的行 将bash 替换成test
[root@linux:~]# sed '/root/s/bin/test/g' passwd.txt 
root:x:0:0:root:/root:/test/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
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:/stest/nologin

案例7.只替换bin为test
[root@linux:~]# sed 's#\bbin\b#test#g' passwd.txt 
root:x:0:0:root:/root:/test/bash
test:x:1:1:test:/test:/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
sync:x:5:0:sync:/sbin:/test/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

案例8.替换passwd.txt中所有的字符
[root@linux:~]# sed 's#[0-Z]##g' passwd.txt 
:::::/://
:::::/://
:::::/://
::::://://
:::::///://
:::::/://
:::::/://
:::::/://
:::::///://
:::::/://

一、awk技巧💞

1.语法结构

取行: awk 'NR==3' file取列: awk '{print $3} ' file****同时取行取列: awk 'NR==3{print $3}' file取出含有某个字符串的行:awk '/字符串/' file区间范围 :awk '/字符串/,/字符串/' file

2.使用awk命令获取文本的某一列技巧

#打印文件的第一列
awk '{print $1}' filename
#打印文件的前两列
awk '{print $1,$2}' filename

NR 存放每行的行号NF 存放最后一列的列号$NF 取最后一列******$(NF-N) 取倒数第几列$0 取所有列的信息(取所有行)

3.awk 获取某些列的某些行(打印或不打印第几行)

#打印文本的第一行
awk 'NR==1' filename
#取test.txt文件中的第1,2列,不打印第一行
awk 'NR!=1 {print $1,$2}' test.txt
#取test.txt文件中的第2行的第3列
awk 'NR==2 {print $3}' test.txt
#输出小于3的行
awk 'NR<3' passwd.txt 
#查找大于2并且小于6的行
awk 'NR>2&&NR<6' passwd.txt 
#查找小于2或者大于5的行
awk 'NR<2||NR>5' passwd.txt 

NR==n 表示打印第n行NR!=n 表示不打印第n行&& 并且|| 或者

4.使用awk命令取某一行数据中的倒数第N列

#取/etc/passwd文件中的第2列、倒数第1、倒数第2、倒数第4列(以冒号为分隔符)
awk -F":" '{print $2,$NF,$(NF-1),$(NF-2),$(NF-3)}' /etc/passwd

参数:-F 指定分隔符

5.使用awk命令取包含某个字符串的行

#查找包含root的行
awk '/root/' passwd.txt 
#区间范围
awk '/adm/,/sync/' passwd.txt 
#找出第一列是oldboy的行
awk '$1=="oldboy"' b.txt 

6.awk中的"匹配"与"不匹配"

[root@kevin~]# cat test.txt
afjdkj 80
lkdjfkja 8080
dfjj 80
jdsalfj 808080
jasj 80
jg 80
linuxidc 80
80 ajfkj
asf 80
80 linuxidc
wang bo
kevin grace
ha  80880

#打印上面test文件中第二列匹配80开头并以80结束的行
[root@kevin~]# awk '{if($2~/^80$/)print}' test.txt
afjdkj 80
dfjj 80
jasj 80
jg 80
linuxidc 80
asf 80
 
#打印上面test文件中第二列中不匹配80开头并以80结束的行
[root@kevin~]# awk '{if($2!~/^80$/)print}' test.txt
lkdjfkja 8080
jdsalfj 808080
80 ajfkj
80 linuxidc
wang bo
kevin grace
ha  80880
 
#打印上面test文件中第二列是"bo"的行
[root@kevin~]# cat test.txt |awk '{if($2=="bo")print}'
wang bo

~ 匹配正则 !~ 不匹配正则 == 等于 != 不等于

7.AWK的内置变量(NF、NR、FNR、FS、OFS、RS、ORS)

NF 字段个数,(读取的列数) NR 记录数(行号),从1开始,新的文件延续上面的计数,新文件不从1开始 FNR 读取文件的记录数(行号),从1开始,新的文件重新从1开始计数 FS 输入字段分隔符,默认是空格 OFS 输出字段分隔符 默认也是空格 RS 输入行分隔符,默认为换行符 ORS 输出行分隔符,默认为换行符

二、sed技巧💞

1.语法结构

取第3行:        sed -n '3p' file
取最后一行:    sed -n '$p' file
取3~5行:        sed -n '3,5' file
取第3行到最后一行:            sed -n '3,$p' file
查找包含某字符串的行:        sed -n '/字符串/p' file
查找以a开头的行:                sed -n '/^a/' file
查找以a结尾的行:                sed -n '/a$/' file
将第三行替换成test:            sed '3c test' file
第三行处插入test字符串:    sed '3i test ' file
在第三行的下面追加test字符串:sed '3a test' file
将内容替换成XXX:                sed 's#内容#替换成#g' file
                        sed '2s#xx#xx#g'
                        sed '//s#xx#xx#g' file

2.参数选项

-n 取消默认sed输出 (与p连用)-r 支持扩展正则-i 直接修改文件的内容

3.动作参数

a 增加ci 插入d 删除

4.查找第几行

#sed输出第三行
sed -n '3p' test.txt 
#sed输出最后一行
sed -n '$p' test.txt 
#sed输出第3~5行
sed -n '3,5p' test.txt 
#sed输出第10行到最后一行
sed -n '10,$p' test.txt 

5.查找包含字符串的行

#查找passwd.txt中包含root的行
sed -n '/root/p' passwd.txt 
#查找passwd.txt中包含bash的行
sed -n '/bash/p' passwd.txt 
#使用正则,查找以r开头的行
sed -n '/^r/p' passwd.txt 
#查找以n结尾的行
sed -n '/n$/p' passwd.txt 
#查找包含root或者sync的行
sed -rn '/root|sync/p' passwd.txt 
#查找包含或a 或b 或 c的行
sed -rn '/a|b|c/p' passwd.txt 
#查找字符串的区间范围使用逗号,查找adm和sync中间的行
sed -rn '/adm/,/sync/p' passwd.txt 

6.删除指定行

#删除第3行
sed '3d' a.txt 
#删除3~5行
sed '3,5d' a.txt

7.替换

#将root全部替换为xiaozhou
sed 's#root#xiaozhou#g' passwd.txt 
#将文件开头全部替换成#   “批量注释”
sed 's/^/#/g' passwd.txt 
#只替换每行的第一个root为xiaozhou    (后边不要加g,,只替换每行的第一个)
sed 's/root/xiaozhou/' passwd.txt 
#将第三行的a替换为A
sed '3s/a/A/g' passwd.txt 
#第3-5行小a替换成A
sed '3,5s/a/A/g' passwd.txt 
#将包含root的行 将bash 替换成test
sed '/root/s/bin/test/g' passwd.txt 
#只替换bin为test
sed 's#\bbin\b#test#g' passwd.txt 
#替换passwd.txt中所有的字符
 sed 's#[0-Z]##g' passwd.txt 

/b字符串/b 边界/<字符串/> 边界

8.后向引用

#使用后向引用取出IP地址
ifconfig ens33|sed -rn '2s#^.*inet (.*) netmask.*#\1#gp'
#取出IP地址和子网掩码
ifconfig ens33|sed -rn '2s#^.*inet (.*) netmask (.*) bro.*$#\1\2#gp'

三、 grep技巧💞

1.语法结构

grep  参数 '字符串' file

2.参数选项

-n 显示匹配内容的行号-r 递归过滤文件-w 匹配整词-v 取反-o 显示匹配过程-E 支持扩展正则 ==egrep

四、awk/grep/awk区别对比💫💯💨

grepsedawk
参数选项-n 显示匹配内容的行号
-r 递归过滤文件
-w 匹配整词
-v 取反
-o 显示匹配过程
-E 支持扩展正则egrep
-n 取消默认sed输出(与p连用)
-r 支持扩展正则
-i 直接修改文件的内容
-F 指定分隔符
取行grep 参数 "字符串" filesed -n '3p' file
sed -n '$p' file
awk 'NR==3' file
awk 'NR!=3' file
取列 awk '{print $3}' file<br />awk '{print $NF}' file
awk '{print $(NF-1)}' file<br />awk 'NR==5{print $3}' file
按字符串查找grep 参数 "字符串" filesed -n '/root/p' file
sed -rn '/root/,/adm/p' file
sed -rn '/root\
adm/p' fileawk '/root/' file
awk '/root/,/adm/' file
awk '/root\
adm/' file
查找替换 sed '2s#a#A#g' file
sed '/root/s#a#A#g' file
后向引用 ifconfig ens33\sed -rn '2s#^.*inet (.*) netmask.*#\1#gp'
其他 动作参数:
a 增加
c 替换
i 插入
d 删除
NR 存放每行的行号
NF 存放最后一列的列号
$NF 取最后一列<br />$(NF-N) 取倒数第几列
$0 取所有列的信息(取所有行)

endl

1

评论

博主关闭了所有页面的评论