一、正则表达式
1.1 正则表达式?
- 匹配有规律的东西:手机号、身份证号、匹配日志
- 正则表达式就出来了,regular expression(RE)
- 使用一些符号表达重复出现,大小写,开头/结尾含义
1.2 应用场景?
|
|
正则表达式 |
Linux三剑客使用,开发语言(python、golang…………) |
应用场景 |
过滤有规律的内容,尤其是日志 |
1.3 正则注意事项
- 所有的符号(英文符号)
- 学习正则,通过grep命令歇息,grep加上单引号
- 给grep、egrep加上颜色
alias grep='grep --color=auto' alias egrep='egrep --color=auto'
- 注意系统的字符集:
en_US
、UTF-8
(大部分情况90%,没问题),如果出现问题修改字符集为export LANG=C
- 快速掌握正则:配合
grep -o
参数学习
1.4 正则符号
分类 |
|
命令 |
基础正则 |
、$、$、*、.*、[a-z]、[^abc] |
grep、sed、awk |
扩展正则 |
+、|、()、{}、? |
egerp、sed -r、awk |
1.5 正则VS通配符
分类 |
诞生目标(用途) |
支持的命令 |
正则(re) |
三剑客,高级语言,进行过滤(匹配字符) |
三剑客:grep、sed、awk、find、rename(ubuntu)、expr |
通配符(pathname extension 或 glob) |
匹配文件(文件名) *.txt、*.log、 |
Linux下面大部分命令都支持 |
1.6 基础正则
| $ cat oldboy.txt |
| I am oldboy teacher! |
| I teach linux. |
| |
| I like badminton ball,billiard ball and chinese chess! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my qq is 49000448 |
| |
| not 49000000448. |
| my god,i am not oldbey,but OLDBOY! |
1.6.1 ^
以……开头的行
| $ grep '^oldboy' oldboy.txt |

1.6.2 $
以……结尾的行
| $ grep '448$' oldboy.txt |
| my qq is 49000448 |
| |
| $ grep '448' oldboy.txt |
| my qq is 49000448 |
| not 49000000448. |
| $ cat -A oldboy.txt |
| I am oldboy teacher!$ |
| I teach linux.$ |
| $ |
| I like badminton ball,billiard ball and chinese chess!$ |
| my blog is http://oldboy.blog.51cto.com $ |
| our size is http://blog.oldboyedu.com $ |
| my qq is 49000448$ |
| $ |
| not 49000000448.$ |
| my god,i am not oldbey,but OLDBOY!$ |
| |
| $ grep 'm$' oldboy.txt |
| |
| $ grep 'm $' oldboy.txt |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
1.6.3 ^$
空行
- 空行这一行中没有任何内容(空格也是符合)
- 空格也是个字符

| $ grep -n '^$' oldboy.txt |
| 3: |
| 8: |
| |
| $ cat -n oldboy.txt |
| 1 I am oldboy teacher! |
| 2 I teach linux. |
| 3 |
| 4 I like badminton ball,billiard ball and chinese chess! |
| 5 my blog is http://oldboy.blog.51cto.com |
| 6 our size is http://blog.oldboyedu.com |
| 7 my qq is 49000448 |
| 8 |
| 9 not 49000000448. |
| 10 my god,i am not oldbey,but OLDBOY |
-
企业应用案例:
-
排除文件中的空行
| $ grep -v '^$' oldboy.txt |
| I am oldboy teacher! |
| I teach linux. |
| I like badminton ball,billiard ball and chinese chess! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my qq is 49000448 |
| not 49000000448. |
| my god,i am not oldbey,but OLDBOY! |
| |
| $ grep -vn '^$' oldboy.txt |
| 1:I am oldboy teacher! |
| 2:I teach linux. |
| 4:I like badminton ball,billiard ball and chinese chess! |
| 5:my blog is http://oldboy.blog.51cto.com |
| 6:our size is http://blog.oldboyedu.com |
| 7:my qq is 49000448 |
| 9:not 49000000448. |
| 10:my god,i am not oldbey,but OLDBOY! |

1.6.4 .
:表示任意一个字符
| $ grep '.' oldboy.txt |
| I am oldboy teacher! |
| I teach linux. |
| I like badminton ball,billiard ball and chinese chess! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my qq is 49000448 |
| not 49000000448. |
| my god,i am not oldbey,but OLDBOY! |
1.6.5 \
:转义字符
| $ grep '.$' oldboy.txt |
| I am oldboy teacher! |
| I teach linux. |
| I like badminton ball,billiard ball and chinese chess! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my qq is 49000448 |
| not 49000000448. |
| my god,i am not oldbey,but OLDBOY! |
| |
| $ grep '\.$' oldboy.txt |
| I teach linux. |
| not 49000000448. |
1.6.6 *
:前一个字符连续出现0次或0次以上
-
连续出现
| $ grep '0*' oldboy.txt |
| I am oldboy teacher! |
| I teach linux. |
| |
| I like badminton ball,billiard ball and chinese chess! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my qq is 49000448 |
| |
| not 49000000448. |
| my god,i am not oldbey,but OLDBOY! |

1.6.7 .*
:任意内容
- 整体记忆:
*
表示所有即可!
- 了解:
.
任意一个字符;+
前一个字符连续出现0次或0次以上!
| $ grep '^.*t' oldboy.txt |
| I am oldboy teacher! |
| I teach linux. |
| I like badminton ball,billiard ball and chinese chess! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| not 49000000448. |
| my god,i am not oldbey,but OLDBOY! |

| $ cat oldboy.txt |
| I am oldboy teacher! |
| I teach linux. |
| |
| I like badminton ball,billiard ball and chinese chess! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my qq is 49000448 |
| |
| not 49000000448. |
| my god,i am not oldbey,but OLDBOY! |
| |
| $ grep '^.*o' oldboy.txt |
| I am oldboy teacher! |
| I like badminton ball,billiard ball and chinese chess! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| not 49000000448. |
| my god,i am not oldbey,but OLDBOY! |

1.6.8 []
、[abc]
:1次匹配1个字符,匹配任意一个字符(a或b或c)
| $ grep '[abc]' oldboy.txt |
| I am oldboy teacher! |
| I teach linux. |
| I like badminton ball,billiard ball and chinese chess! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my god,i am not oldbey,but OLDBOY! |
| |
| # 显示匹配过程 |
| $ grep -o '[abc]' oldboy.txt |
| a |
| b |
| a |
| c |
| a |
| c |
| b |
| a |
| b |
| a |
| b |
| a |
| b |
| a |
| a |
| c |
| c |
| b |
| b |
| b |
| c |
| c |
| b |
| b |
| c |
| a |
| b |
| b |

[a-z]
:所有小写字符
[A-Z]
:所有大写字符
[0-9]
:所有数字
[a-zA-Z0-9]
、[a-Z0-9]
:所有字母、数字
| $ grep '[a-z]' oldboy.txt |
| $ grep '[A-Z]' oldboy.txt |
| $ grep '[0-9]' oldboy.txt |
| $ grep '[a-zA-Z0-9]' oldboy.txt |
| $ grep '[a-Z0-9]' oldboy.txt |
1.6.9 [^]
、[^abc]
:取反,排除a或b或c
| $ grep '[^abc]' oldboy.txt |
| I am oldboy teacher! |
| I teach linux. |
| I like badminton ball,billiard ball and chinese chess! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my qq is 49000448 |
| not 49000000448. |
| my god,i am not oldbey,but OLDBOY! |

1.6.10 总结
基础正则 |
含义 |
^ |
以…… 开头的行 |
$ |
以…… 结尾的行 |
^$ |
空行 |
. |
任意一个字符 |
* |
前一个字符连续出现(重复)0次或0次以上 |
.* |
所有内容 |
\ |
转移字符,\n 、\t |
[] |
一个整体,匹配任意一个字符[abc] ,a或b或c |
[^] |
取反、排除[^abc] |
正则贪婪性 |
熟悉特点就OK,.* 或连续出现 |
1.7 扩展正则
1.7.1 +
:前一个字符出现1次或1次以上
| $ grep '0+' oldboy.txt |
| |
| $ egrep '0+' oldboy.txt |
| my qq is 49000448 |
| not 49000000448. |
| |
| $ grep -E '0+' oldboy.txt |
| my qq is 49000448 |
| not 49000000448. |
| |
| # 了解 |
| $ grep '0\+' oldboy.txt |
| my qq is 49000448 |
| not 49000000448. |
| $ egrep '[0-9]+' oldboy.txt |
| my blog is http://oldboy.blog.51cto.com |
| my qq is 49000448 |
| not 49000000448. |
1.7.2 |
:或者
| $ egrep 'oldboy|oldbey' oldboy.txt |
| I am oldboy teacher! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my god,i am not oldbey,but OLDBOY! |

1.7.3 []
或|
区别
符号 |
含义 |
[] |
1次匹配1个字符 |
| |
匹配1个字符或多个 |
1.7.4 ()
:表示被括起来的内容,表示一个整体(一个字符),后向引用(反向引用,sed)
- 被括起来的内容,表示一个整体(一个字符)
- 后向引用(反向引用,sed)
| $ egrep 'oldboy|oldbey' oldboy.txt |
| I am oldboy teacher! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my god,i am not oldbey,but OLDBOY! |
| |
| $ egrep 'oldb(o|e)y' oldboy.txt |
| I am oldboy teacher! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my god,i am not oldbey,but OLDBOY! |
| |
| $ egrep 'oldb[oe]y' oldboy.txt |
| I am oldboy teacher! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my god,i am not oldbey,but OLDBOY! |

1.7.5 {}
:连续出现
符号 |
含义 |
|
o |
前一个字母o,至少连续出现n次,最多连续出现m次 |
>=n <=m |
o |
前一个字母o,连续出现n次 |
==n |
o |
前一个字母o,至少连续出现n次 |
>=n |
o |
前一个字母o,最多连续出现n次 |
<=m |
| $ egrep '0{1,3}' oldboy.txt |
| my qq is 49000448 |
| not 49000000448. |
| |
| $ egrep '0{3}' oldboy.txt |
| my qq is 49000448 |
| not 49000000448. |
| |
| $ egrep '0{3,}' oldboy.txt |
| my qq is 49000448 |
| not 49000000448. |
| |
| $ egrep '0{,3}' oldboy.txt |
| I am oldboy teacher! |
| I teach linux. |
| |
| I like badminton ball,billiard ball and chinese chess! |
| my blog is http://oldboy.blog.51cto.com |
| our size is http://blog.oldboyedu.com |
| my qq is 49000448 |
| |
| not 49000000448. |
| my god,i am not oldbey,but OLDBOY! |

1.7.6 ?
:连续出现,前一个字符出现0次或1次
| $ cat wen.txt |
| gooood |
| goood |
| good |
| god |
| gd |
| |
| $ egrep 'god|gd' wen.txt |
| god |
| gd |
| |
| $ egrep 'go?d' wen.txt |
| god |
| gd |
1.7.7 总结
符号 |
含义 |
+ |
前一个字符连续出现1次或1次以上 |
| |
或者 |
() |
一个整体,sed反向引用 |
{} |
o{n,m} :前一个字母o,至少连续出现n次,最多连续出现m次 |
? |
前一个字符连续出现0次或1次 |
二、三剑客
2.1 三剑客特点及应用场景
命令 |
特点 |
场景 |
grep |
过滤 |
grep命令过滤速度是最快的 |
sed |
替换,修改文件内容,取行 |
如果进行替换/修改文件 取出某个范围的内容 |
awk |
取列,统计计算 |
取列 对比,比较 统计,计算(awk数组) |
2.2 三剑客——grep
选项 |
含义 |
-E |
egrep 支持扩展正则 |
-A |
after -A5:匹配你要的内容显示接下面的5行 |
-B |
before -B5:匹配你要的内容显示接上面的5行 |
-C |
context -C5:匹配你要的内容显示接上下5行 |
-c |
统计出现了多少次,类似于wc -l |
-v |
取反,排除(行) |
-n |
显示行号 |
-i |
忽略大小写 |
-w |
精确匹配 |
| # -A |
| $ seq 10 | grep -A3 5 |
| 5 |
| 6 |
| 7 |
| 8 |
| |
| # -B |
| $ seq 10 | grep -B3 5 |
| 2 |
| 3 |
| 4 |
| 5 |
| |
| # -C |
| $ seq 10 | grep -C3 5 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| |
| # -c |
| $ ps -ef | grep sshd | wc -l |
| 4 |
| $ ps -ef | grep -c sshd |
| 4 |
| |
| # -v |
| $ ps -ef | grep crond | grep -v grep |
| # 可以使用下面这种简单的方法 |
| $ ps -ef | grep '[c]rond' |
| |
| # -w |
| $ ss -lnt | grep -w 22 |
| |
2.3 三剑客——sed
2.3.1 特点及格式
- sed:stream editor 流编辑器
- sed格式
命令 |
选项 |
sed命令功能 |
参数(文件) |
sed |
-r |
's#oldboy#oldgirl#g' |
oldboy.txt |
功能 |
|
s |
替换 |
p |
打印 |
d |
删除 |
c/a/i |
增加c/a/i |
2.3.2 sed核心应用
1)sed——查找p
查看格式 |
|
'1p' '2p' |
指定行号进行查找 |
'1,5p' |
指定行号范围进行查找 |
'/lidao/p' |
类似于grep过滤,//里面可以写正则 |
'/10:00/,/11:00/p' |
表示范围的过滤 |
| $ cat oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
| 110,lidao,COCO |
| |
| # 指定行号 |
| $ sed -n '2p' oldboy.txt |
| 102,zhangyao,CTO |
| |
| # 指定行号范围 |
| $ sed -n '2,5p' oldboy.txt |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
| # 从第2行到最后一行 |
| $ sed -n '2,$p' oldboy.txt |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
| 110,lidao,COCO |
| $ sed -n '/oldboy/p' oldboy.txt |
| 101,oldboy,CEO |
| |
| $ sed -n '/10/p' oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
| 110,lidao,COCO |
| |
| # 过滤包含4或者5的行 |
| $ sed -n '/[45]/p' oldboy.txt |
| 104,yy,CFO |
| 105,feixue,CIO |
| |
| $ sed -n '/[0-9]/p' oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
| 110,lidao,COCO |
| |
| # 正则 |
| $ sed -nr '/[0-9]+/p' oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
| 110,lidao,COCO |
| $ sed -nr '/[0-9]{3}/p' oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
| 110,lidao,COCO |
| |
| # 范围过滤 |
| $ sed -n '/102/,/105/p' oldboy.txt |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
2)sed——删除
查看格式 |
|
'1d' '2d' |
指定行号进行查找 |
'1,5d' |
指定行号范围进行查找 |
'/lidao/d' |
类似于grep过滤,//里面可以写正则 |
'/10:00/,/11:00/d' |
表示范围的过滤 |
| $ sed '1d' oldboy.txt |
| $ sed '1,5d' oldboy.txt |
| $ sed '/lidao/d' oldboy.txt |
| $ sed -r '/^$|#/d' /etc/ssh/sshd_config |
| $ egrep -v '^$|#' /etc/ssh/sshd_config |
| |
| # !的妙用 |
| $ sed -nr '/^$|#/!p' /etc/ssh/sshd_config |
3)sed——增加c、a、i
命令 |
|
|
c |
replace:替代这行的内容 |
|
a |
append:追加,向指定的行或每一行追加内容(行后面) |
|
i |
insert:插入,向指定的行或每一行插入内容(行前面) |
|
| $ cat oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
| 110,lidao,COCO |
| |
| $ sed '3a 996,lidao996,UFO' oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 996,lidao996,UFO |
| 104,yy,CFO |
| 105,feixue,CIO |
| 110,lidao,COCO |
| $ sed '3i 996,lidao996,UFO' oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 996,lidao996,UFO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
| 110,lidao,COCO |
| $ sed '3c 996,lidao996,UFO' oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 996,lidao996,UFO |
| 104,yy,CFO |
| 105,feixue,CIO |
| 110,lidao,COCO |
| # 向config中追加内容 |
| UseDNS no |
| GSSAPIAUTCATION no |
| PermitRootLogin no |
| |
| # 方法1: |
| $ cat >> config <<'EOF' |
| UseDNS no |
| GSSAPIAUTCATION no |
| PermitRootLogin no |
| EOF |
| |
| # 方法2: |
| $ sed '$a UseDNS no\nGSSAPIAUTCATION no\nPermitRootLogin no' config |
4)sed——替换s
- s ---> sub substitute 替换
- g ---> global 全局替换,sed替换每行所有匹配的内容,sed默认只替换每行第一个匹配的内容
| $ sed 's#[0-9]##' oldboy.txt |
| 01,oldboy,CEO |
| 02,zhangyao,CTO |
| 03,李导996,COO |
| 04,yy,CFO |
| 05,feixue,CIO |
| 10,lidao,COCO |
| $ sed 's#[0-9]##g' oldboy.txt |
| ,oldboy,CEO |
| ,zhangyao,CTO |
| ,李导,COO |
| ,yy,CFO |
| ,feixue,CIO |
| ,lidao,COCO |
| $ echo 123456 | sed -r 's#(.*)#<\1>#g' |
| <123456> |
| |
| $ echo lvzhenjiang_linux | sed -r 's#(^.*)_(.*$)#\2_\1#g' |
| linux_lvzhenjiang |
| |
| $ ip a s ens33 | sed -n '/inet/p' | sed -r 's#(^.* )(.*)(/.*$)#\2#g' |
| 192.168.99.181 |
四、三剑客——awk
4.1 awk内置变量
内置变量 |
|
NR |
记录行,行号 |
NF |
每行有多少个字段(列),$NF表示最后一列 |
FS |
-F:指定字段分隔符 |
OFS |
-vOFS:指定输出字段分隔符 |
4.2 行与列
名词 |
awk中的叫法 |
一些说明 |
行 |
记录record |
每一行默认通过回车分隔的 |
列 |
字段,域field |
每一行默认通过空格分隔的 |
awk中行和列结束标记都是可以修改的 |
|
|
1)取行
awk |
|
|
NR==1 |
取出某一行 |
|
NR>=1 && NR<=5 |
取出1到5行 范围 |
|
/oldboy/ |
|
|
/101/,/105/ |
|
|
符号 |
>、<、>=、<=、==、!= |
|
| $ cat oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
| 110,lidao,COCO |
| |
| $ awk 'NR==1' oldboy.txt |
| 101,oldboy,CEO |
| |
| $ awk 'NR>=1 && NR <=5' oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
| |
| $ awk '/oldboy/' oldboy.txt |
| 101,oldboy,CEO |
| |
| $ awk '/101/,/105/' oldboy.txt |
| 101,oldboy,CEO |
| 102,zhangyao,CTO |
| 103,李导996,COO |
| 104,yy,CFO |
| 105,feixue,CIO |
2)取列
-F
:指定分隔符,指定每一列结束标记(默认是空格、连续的空格、tab键)
$数字
:取出某一列,注意:在awk中$内容一个意思,表示取出某一列
$0
:取出整行的内容
$NF
:表示最后一列
| $ ls -l /tmp/ | awk '{print $5,$9}' |
| |
| 28766 kk-node01.root.history |
| 17 systemd-private-24f3a640f6c64ab78797fb775b60002f-chronyd.service-VxcyPj |
| 6 vmware-root_9016-2866351041 |
| 6 vmware-root_9024-3134929799 |
| 6 vmware-root_9085-4121797114 |
| |
| # column -t 格式化输出 |
| $ ls -l /tmp/ | awk '{print $5,$9}' | column -t |
| 28907 kk-node01.root.history |
| 17 systemd-private-24f3a640f6c64ab78797fb775b60002f-chronyd.service-VxcyPj |
| 6 vmware-root_9016-2866351041 |
| 6 vmware-root_9024-3134929799 |
| 6 vmware-root_9085-4121797114 |
| |
| $ ls -l /tmp/ | awk '{print $5,$NF}' | column -t |
| 28907 kk-node01.root.history |
| 17 systemd-private-24f3a640f6c64ab78797fb775b60002f-chronyd.service-VxcyPj |
| 6 vmware-root_9016-2866351041 |
| 6 vmware-root_9024-3134929799 |
| 6 vmware-root_9085-4121797114 |
| |
| $ awk -F':' '{print $1,$NF}' /etc/passwd | column -t | head -3 |
| root /bin/bash |
| bin /sbin/nologin |
| daemon /sbin/nologin |
| |
| $ awk -F':' '{print $1"@@"$NF}' /etc/passwd | column -t | head -3 |
| root@@/bin/bash |
| bin@@/sbin/nologin |
| daemon@@/sbin/nologin |
| |
| $ awk -F':' -vOFS=':' '{print $NF,$2,$3,$4,$5,$6,$1}' /etc/passwd | head -3 |
| /bin/bash:x:0:0:root:/root:root |
| /sbin/nologin:x:1:1:bin:/bin:bin |
| /sbin/nologin:x:2:2:daemon:/sbin:daemon |
4.3 awk模式匹配
| $ ip a s ens33 | awk 'NR==3' | awk -F"[ /]+" '{print $3}' |
| 192.168.99.181 |
- 比较符号:>、<、>=、<=、==、!=
- 正则:
- 范围表达式:
- 特殊条件:BEGIN和END
1)比较表达式——参考取行部分
2)正则:
- // 支持扩展正则
- awk可以精确到某一列,某一列中包含/不包含...内容
- ~:包含
- !~:不包含
正则 |
awk正则 |
^表示以……开头的行 |
某一列的开头 $3~/^oldbly/ |
$表示以……结尾的行 |
某一列的结尾 $3~/oldboy$/ |
^$ 表示空行 |
某一列的是空的 $3~/^$/ |
| # 找出/etc/passwd/文件中第三列以1开头的行 |
| $ awk -F':' '$3~/^1/' /etc/passwd |
| bin:x:1:1:bin:/bin:/sbin/nologin |
| operator:x:11:0:operator:/root:/sbin/nologin |
| games:x:12:100:games:/usr/games:/sbin/nologin |
| ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin |
| systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin |
| |
| # 找出/etc/passwd文件中第三列以2开头,并显示第一列、第三列、最后一列 |
| $ awk -F':' '$3~/^2/{print $1,$3,$NF}' /etc/passwd |
| daemon 2 /sbin/nologin |
| rpcuser 29 /sbin/nologin |
| |
| # 找出/etc/passwd文件中第三列以1或者以2开头,并显示第一列、第三列、最后一列 |
| $ awk -F':' '$3~/^[12]/{print $1,$3,$NF}' /etc/passwd |
| bin 1 /sbin/nologin |
| daemon 2 /sbin/nologin |
| operator 11 /sbin/nologin |
| games 12 /sbin/nologin |
| ftp 14 /sbin/nologin |
| systemd-network 192 /sbin/nologin |
| rpcuser 29 /sbin/nologin |
| |
| $ awk -F':' '$3~/^(1|2)/{print $1,$3,$NF}' /etc/passwd |
| bin 1 /sbin/nologin |
| daemon 2 /sbin/nologin |
| operator 11 /sbin/nologin |
| games 12 /sbin/nologin |
| ftp 14 /sbin/nologin |
| systemd-network 192 /sbin/nologin |
| rpcuser 29 /sbin/nologin |
3)表示范围
- /哪里开始/,/哪里结束/
- NR1,NR5 从第1行开始到第5行结束,类似于
sed -n '1,5p'
| # 显示指定时间内范围内的IP地址 |
| $ awk '/11:02:00/,/11:02:30/{print $1}' access.log |
4)特殊模式BEGIN{}和END{}
模式 |
含义 |
应用场景 |
BEGIN{} |
里面的内容会在awk读取文件之前执行 |
1)进行简单的统计,计算,不涉及读取文件(常见) 2)用来处理文件之前,添加个表头(了解) 3)用来定义awk变量(很少用) |
END{} |
里面的内容会在awk读取文件之后执行 |
1)awk进行统计,一般过程:先进行计算,最后END输出结果(常见) 2)awk使用数组,用来输出数组结果(常见) |
| $ awk '/^$/{i++}END{print i}' /etc/services |
| 17 |
| $ seq 100 | awk '{sum=sum+$1}END{print sum}' |
| 5050 |
4.4 awk数组
|
shell 数组 |
awk 数组 |
|
形式 |
array[0]=oldboy array[1]=lidao |
array[0]=oldboy array[1]=lidao |
|
使用 |
echo ${array[0]} $ |
print array[0] array[1] |
|
批量输出数组内容 |
for i in ${array[*]} do echo $i done |
for (i in array) print array[i] |
awk数组专用循环,变量获取到的是数组下标,如果想要数组的内容:数组[下标] |
| # awk字母 会被识别为变量,如果只是想使用字符串需要使用双引号引起来 |
| $ awk 'BEGIN{a[0]="oldboy"; a[1]="lidao"; print a[0],a[1]}' |
| oldboy lidao |
| |
| $ awk 'BEGIN{a[0]="oldboy"; a[1]="lidao"; for(i in a) print i,a[i]}' |
| 0 oldboy |
| 1 lidao |
4.5 for 循环
shell编程C语言for循环 |
awk for循环 |
|
for((i=1,i<=10,i++)) do echo $i done |
for(i=1,i<=10,i++) print i |
awk for循环用来循环每个字段 |
| $ awk 'BEGIN{for(i=1;i<=100;i++)sum+=i;print sum}' |
| 5050 |
4.6 if判断
shell if判断 |
awk if判断 |
|
if [ 条件 ];then echo "OK" fi |
if(条件) print "OK" |
常用 |
if [ 条件 ];then echo "OK"
else echo "not OK" fi |
if(条件) print "OK" else print "not OK" |
|
| # 统计磁盘空间使用率,如果大于70%,则提示磁盘空间不足,并显示磁盘分区,磁盘使用率,磁盘挂载点 |
| $ df -h | awk -F"[ %]+" 'NR>1{if($5>=75)print "disk not enough", $1,$5,$NF}' |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律