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 | 增加 | p | print,打印匹配行内容 |
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区别对比💫💯💨
grep | sed | awk | |||
---|---|---|---|---|---|
参数选项 | -n 显示匹配内容的行号 -r 递归过滤文件 -w 匹配整词 -v 取反 -o 显示匹配过程 -E 支持扩展正则egrep | -n 取消默认sed输出(与p连用) -r 支持扩展正则 -i 直接修改文件的内容 | -F 指定分隔符 | ||
取行 | grep 参数 "字符串" file | sed -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 参数 "字符串" file | sed -n '/root/p' file sed -rn '/root/,/adm/p' file sed -rn '/root\ | adm/p' file | awk '/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 取所有列的信息(取所有行) |
评论