三剑客(grep、sed、awk)
haihaihai,亲们,你们最爱的小橘来啦,今天分享一下我前端时间刚整理出来的三剑客,内容有点长,可能有一些地方整理的不太好,大家有异议的可以评论讨论哈!
1.💓grep 文本搜索工具
语法结构:参数选项:
| 参数选项 | 注释说明 | 参数选项 | 注释说明 | 
| -w | 精准匹配整词 | -n | 显示匹配内容的行号 | 
| -v | 取反 | -c | 只显示匹配的行数 | 
| -E | 扩展正则 | -o | 匹配过程 | 
| -i | 忽略大小写 | -A | 过滤内容,往下显示n行 | 
| -r | 递归过滤文件内容 | -B | 过滤内容,往上显示n行 | 
| -l | 只显示符合匹配条件的文件名 | -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 字段个数,(读取的列数) | 
二、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 增加 c i 插入 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 awk '{print $NF}' file awk '{print $(NF-1)}' file 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 取最后一列 $(NF-N) 取倒数第几列 $0 取所有列的信息(取所有行) | 
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号