经常操作日志的小伙伴们对awk命令肯定不陌生,awk工具给我们分析日志提供了很便捷的操作,帮助我们完成统计和分析日志,也有很多小伙伴不会用到awk。awk作为一个强大的工具,对于我们工作能力和工作效率的提升,都有很多帮助,下面就让我们来领略一下awk的强大吧!
1.awk简介
awk适合文本处理和报表生成,在linux系统日常处理工作中,发挥了重要的作用,awk是三剑客的老大,利刃出销,必将不凡。
2.awk介绍
例如:awk '{print $0}' /etc/passwd
![d346114ef4af3589c3d0b7a2587baa85.png](https://i-blog.csdnimg.cn/blog_migrate/f4e3c23dea68e755ea7c9cb9b7b22413.jpeg)
awk命令简单使用
解释:我们执行完上述命令之后,/etc/passwd文件的内容出现在眼前了。
在调用awk时,我们指定/etc/passwd为输入文件。执行awk时,会依次对/etc/passwd中的每一行执行print命令。所有输出都发送到stdout,所得到的结果和cat /etc/passwd相同。
再次强调:awk对输入文件中的每一行都执行这个脚本。
![00bd6df3bc037913ba9be3d330c1d1dd.png](https://i-blog.csdnimg.cn/blog_migrate/9c2e7da45111a9234ec5290d4885fc69.jpeg)
简单说明
例如:awk -F ":" '{print $1}' /etc/passwd
![55a39a94f4e4544ce25eb2f49cee7446.png](https://i-blog.csdnimg.cn/blog_migrate/9954710f83d69866e86a6c4472985a5c.jpeg)
例如:awk -F ":" '{print $1 $3}' /etc/passwd
![d2435ab163f69a15fbd56927b3d71777.png](https://i-blog.csdnimg.cn/blog_migrate/f73067a22fe9f380c8de9b77137a27f2.jpeg)
例如:awk -F ":" '{print $1 " " $3}' /etc/passwd
![71e09f23bfb5acb53226db2f7ec5577c.png](https://i-blog.csdnimg.cn/blog_migrate/39cc71af320e1e6c9052cd9123a0c549.jpeg)
例如:awk -F ":" '{print "username:"$1 "uid:"$3}' /etc/passwd
![6418c9ebd49d1f48cc90ec03285b8f93.png](https://i-blog.csdnimg.cn/blog_migrate/980231d253ddf1077c8eef7cf0c52c5a.jpeg)
3.BEGIN和END模块
对于每个输入行,awk都会执行每个脚本代码块一次。然而,在很多情况下,可能需要在awk开始输入文件中的文本之前执行初始化代码。对于这种情况,awk允许您定义一个BEGIN块。awk在开始处理输入文件之前会执行BEGIN块,所以它是初始化FS(字段分隔符)变量、打印页眉或初始化其他在程序中以后会引用的全局变量的最佳位置。
awk还提供了END模块。awk在处理了输入文件中的所有行之后执行这个块。通常,END块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。
4.运算符
![71a55c0a0fe1ad4f08ada3de41b9b3b8.png](https://i-blog.csdnimg.cn/blog_migrate/19bee0a0cbf4e06edf887e799cc5b3ff.jpeg)
awk运算符
例如:赋值运算符
awk 'BEGIN{a=5;a+=5;print a}'
![d3a9936870fb40c9941e706f30e67ba7.png](https://i-blog.csdnimg.cn/blog_migrate/9eae33817dfbc65c345758ef7800fe6b.jpeg)
赋值运算符示例
例如:逻辑运算符
awk 'BEGIN{a=1;b=2;print(a>2&&b>1,a=1||b>1)}'
![baa317d4a4b01336acb448965f77ce47.png](https://i-blog.csdnimg.cn/blog_migrate/4721313c2a935fda10eb734dba102865.jpeg)
逻辑运算符示例
例如:正则运算符
awk 'BEGIN{a="100testaaa"; if(a~/100/){print "ok"}}'
![3e4249754b81351b489f590bc6486582.png](https://i-blog.csdnimg.cn/blog_migrate/db5d2cd6ecaf37c9982c35b41e61d250.jpeg)
例如:关系运算符
说明:>
awk 'BEGIN{a="11";if(a>=9){print "ok"}}'
awk 'BEGIN{a=11;if(a>=9){print "ok"}}'
awk 'BEGIN{a;if(a>=b){print "ok"}}'
![451c042d9abb4bd21dbec5a4899027f1.png](https://i-blog.csdnimg.cn/blog_migrate/2c997bcfdad76080d8a9d53ead64f6f8.jpeg)
关系运算符示例
例如:算术运算符
说明:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0。
awk 'BEGIN{a="b";print a++, ++a}'
awk 'BEGIN{a="20b4";print a++, ++a}'
awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
![c007ba951cd2f353b1a99119ca8403a7.png](https://i-blog.csdnimg.cn/blog_migrate/7e7f90f2deb43a19c8fa2de7457759c0.jpeg)
5.awk内置变量
![d61c6c25ce8ab804ea45a04b19b24e5f.png](https://i-blog.csdnimg.cn/blog_migrate/414bce32590481626c44a24da5a82d1f.jpeg)
awk内置变量
例如:字段分隔符FS
FS=""一个或多个Tab分隔
awk 'BEGIN{FS="+"}{print $1,$2,$3}' tab.txt
![097e46e309d41612ec4bf6dcfbb7da82.png](https://i-blog.csdnimg.cn/blog_migrate/763aeb8a44cde2cf0f81b7aa0b713651.jpeg)
字段分隔符示例
FS="[[:space:]+]"一个或多个空白格
![d193b44ca77d57b654bbf12ecde85a3e.png](https://i-blog.csdnimg.cn/blog_migrate/9278b077ab1044c79af78e0d9b23a729.jpeg)
空白格示例
FS="["":]+"以一个或多个空格或:分隔
![1486e505d87ef89a54d2890f09bab1e5.png](https://i-blog.csdnimg.cn/blog_migrate/99a908beac2c3ac996aab989f9a8fa6f.jpeg)
空白格示例
字段数量NF
![c725c182587448e5282e939b82e9e366.png](https://i-blog.csdnimg.cn/blog_migrate/354773c9a41358589c5cfb6ce0ebba56.jpeg)
字段数量示例
记录数量NR
![1f5ed870dbd09faa0c39d72871086fb7.png](https://i-blog.csdnimg.cn/blog_migrate/ecdab94cfb41073a3d98f3a5507fcc80.jpeg)
记录数量示例
RS记录分隔符变量
将FS设置成""告诉awk每个字段都占据一行。通过将RS设置成"",还会告诉awk每个地址记录都由空白行分隔。
![0e59750d00a6cb19b08a7eeea38af49a.png](https://i-blog.csdnimg.cn/blog_migrate/4ad8ffaf4c567c06f5d26dfed52a8ae1.jpeg)
![611d6e018eb60d17bdf2c5b6b07b79bf.png](https://i-blog.csdnimg.cn/blog_migrate/b8ed0354f00cac7fff1cb0d7b1ec4d88.jpeg)
记录分隔符变量示例
OFS输出字段分隔符
![c905ea794bbcd13352bf0219f953b625.png](https://i-blog.csdnimg.cn/blog_migrate/084b72a83ba1bc0b52ca0713ed207707.jpeg)
输出字段分隔符示例
ORS输出记录分隔符
![aa2aad2f9eb2b42e8e5f6498dccff78e.png](https://i-blog.csdnimg.cn/blog_migrate/9584563e5daadb6878e7e1205db148fb.jpeg)
输出记录分隔符示例
6.awk正则
![761c9dbb095e6de5edfc9f455d6c53e2.png](https://i-blog.csdnimg.cn/blog_migrate/ed2ac636b9f4c0b6b7ddf1ff59240ed9.jpeg)
正则示例
比如:规则表达式
awk '/REG/{action}' file,/REG/为正则表达式,可以将$0中,满足条件的记录送入到:action进行处理。
![1ee4ed52aca84f9acd479fa0e6cf7bcb.png](https://i-blog.csdnimg.cn/blog_migrate/131864766c04b25b5a645a9eb8966764.jpeg)
规则表达式示例
![281d0f23097f39b8ca2271cf3589d291.png](https://i-blog.csdnimg.cn/blog_migrate/7b66d283dc2f37be51386211e0d7d0c3.jpeg)
规则表达式示例
比如:布尔表达式
awk '布尔表达式{action}' file仅当对前面的布尔表达式求值为真时,awk才执行代码块。
![2e31cd7723bfcdd82f9f2dfa35d0703a.png](https://i-blog.csdnimg.cn/blog_migrate/3c76d0f9da446ad0d64229d1a9696602.jpeg)
布尔表达式示例
7.awk的if、循环和数组
比如:条件语句
![a6b3e4be740d243029acb07fbd14bb0b.png](https://i-blog.csdnimg.cn/blog_migrate/99021a625ed5de4834218196e1dfabdb.jpeg)
条件语句示例
使用if语句还可以将代码:
![af8b42872a6a1ca9fd6c11fa0710443c.png](https://i-blog.csdnimg.cn/blog_migrate/7d5a9b08530973e3512a2ebdd0e2a58a.jpeg)
转换为:
![59d79aed9506cb63dba964dfdd2f06f4.png](https://i-blog.csdnimg.cn/blog_migrate/16dc3b3f2a00ff9d3b62e4a2560f0149.jpeg)
比如:循环结构
awk还有"do...while"循环,它在代码块结尾处对条件求值,而不像标准的while循环那样在开始处求值。
![072e606982a5648ea002d555362b373d.png](https://i-blog.csdnimg.cn/blog_migrate/57439f171b1c1fc00730e78cad728d07.jpeg)
循环结构示例
和一般的while循环不同,由于在代码块之后对条件求值,"do...while"循环永远都至少执行一次。
比如:for循环
awk允许创建for循环,它就像while循环。
![70cc160d67571c7b01fd1ffce450610a.png](https://i-blog.csdnimg.cn/blog_migrate/e888a8357fae8b63abea6426dcf867da.jpeg)
for循环示例
![0255285aa85f70b4d091b9641587191d.png](https://i-blog.csdnimg.cn/blog_migrate/299a5ed5c0bd286899f14ceec31f09b0.jpeg)
for简短示例
上面代码打印:
![ac11945f06ac1828cf9e2b38975493eb.png](https://i-blog.csdnimg.cn/blog_migrate/aa2fc9d5916cef7f36b45d8f687eb82a.jpeg)
打印结果
比如:break和continue
awk提供了break和continue语句。使用这些语句可以更好的控制awk的循环结果。
![1c4fa8ad381d7732c660d332fb8954c0.png](https://i-blog.csdnimg.cn/blog_migrate/0325da6322741fad664f0a0956eabb94.jpeg)
死循环示例
![1a5dc6d803aa4c34c12e4c8ecdd19455.png](https://i-blog.csdnimg.cn/blog_migrate/46898f4e2860d3f1356dcf5592599e4c.jpeg)
break示例
break语句用于"逃出"最深层的循环。"break"使循环立即终止,并继续执行循环代码块后面的语句。
continue语句补充了break。
![6b67da51c2a00253a0f2a2e4664c5f67.png](https://i-blog.csdnimg.cn/blog_migrate/a3390c578007ad0e6ba8bcd96ab696fd.jpeg)
continue中使用break示例
这段代码打印"iteration1"到"iteration21","iteration4"除外。如果迭代等于4,则增加x并调用continue语句,该语句立即使awk开始执行下一个循环迭代,而不执行代码块的其余部分。如同break一样,continue语句适合各种awk迭代循环。在for循环主体中使用时,continue将使循环控制变量自动增加。如下等价循环:
![5d35e30009cba275b7c220744494c6f1.png](https://i-blog.csdnimg.cn/blog_migrate/117e3b9e9d05c409c9a71e9629f9f55c.jpeg)
在while循环中时,在调用continue之前没必要增加x,因为for循环会自动增加x。
比如:数组
awk中的数组都是关联数组,数字索引也会转变为字符串索引
![35bb3df2ce032348391b564caac3de44.png](https://i-blog.csdnimg.cn/blog_migrate/1608ba09887e4952ae17f4b32d47f209.jpeg)
for...in输出,因为数组是关联数组,默认是无序的。所以通过for...in得到无序的数组。如果需要得到有序数组,需要通过下标获得。
比如:用awk中查看服务器连接状态并汇总
![19794d22878104bba35a9ce9dca845a1.png](https://i-blog.csdnimg.cn/blog_migrate/143affd36ea73525f24afd07beb775bb.jpeg)
比如:统计web日志访问流量,要求输出访问次数,请求页面或图片,每个请求的总大小,总访问流量的大小汇总。
![e17d59a1d46e02c5ab48a1519c974657.png](https://i-blog.csdnimg.cn/blog_migrate/3e95dc57901ab9fe761f3ecccc533678.jpeg)
8.awk常用字符串函数
![160932793d5ee8341b621bcd7991d770.png](https://i-blog.csdnimg.cn/blog_migrate/d8518fcb7e565df7688663ca3899f651.jpeg)
![f84a40c1f4749e6a83104c02d7438c63.png](https://i-blog.csdnimg.cn/blog_migrate/d6cd4b95b6a549b77c7fe8a0febc422e.jpeg)
比如:替换
![ed782799c1a0fcf4c2812f5a661ad792.png](https://i-blog.csdnimg.cn/blog_migrate/453009f2de9b0453f3e07863993a3d02.jpeg)
比如:查找
![7d51e41c92d96e7e430413aac02cdfbe.png](https://i-blog.csdnimg.cn/blog_migrate/06ea375faa84ab3688c6901a6076ed24.jpeg)
比如:匹配查找
![a6f0fef526a9b98e86eaa6cfa546f312.png](https://i-blog.csdnimg.cn/blog_migrate/49fc3f6339ae65417e5f424368403476.jpeg)
比如:截取
![6d22f17469b34d1d3d212f0ca7f9b402.png](https://i-blog.csdnimg.cn/blog_migrate/648f33d0172164ce80f52a22de5d8418.jpeg)
比如:分割
![318d20076f2f1c299219458dd10d7070.png](https://i-blog.csdnimg.cn/blog_migrate/a745e0f76e213da03094c7e3eb83186d.jpeg)
希望对大家有多多帮助,如果大家有什么不懂的知识点,可以在评论区留言,我会给大家一一讲解!