- A+
在本博客中,AWK是一个系列文章,本人会尽量以通俗易懂的方式递进的总结awk命令的相关知识点。
awk系列博文直达链接:AWK命令总结之从放弃到入门(通俗易懂,快进来看)
这篇文章中的知识点是建立在前文的基础上的,如果你还没有掌握前文中的知识,请先参考之前的文章。
我们之前一直在提,awk的使用语法如下(我想你已经很熟悉了):
awk [options] 'Pattern {Action}' file1 file2 ···
对于options(选项)而言,我们使用过-F选项,也使用过-v选项。
对于Action(动作)而言,我们使用过print与printf,之后的文章中,我们还会对Action进行总结。
对于Pattern(模式)而言,我们在刚开始学习awk时,就介绍了两种特殊模式,BEGIN模式和END模式,但是,我们并没有详细的介绍"模式"是什么,怎么用,而此处,我们将详细的介绍一下awk中的模式。
"模式"这个词听上去文绉绉的,不是特别容易理解,那么我们换一种说法,我们把"模式"换成"条件",可能更容易理解,那么"条件"是什么意思呢?我们知道,awk是逐行处理文本的,也就是说,awk会先处理完当前行,再处理下一行,如果我们不指定任何"条件",awk会一行一行的处理文本中的每一行,如果我们指定了"条件",只有满足"条件"的行才会被处理,不满足"条件"的行就不会被处理。这样说是不是比刚才好理解一点了呢?这其实就是awk中的"模式"。
再啰嗦一遍,当awk进行逐行处理的时候,会把pattern(模式)作为条件,判断将要被处理的行是否满足条件,是否能跟"模式"进行匹配,如果匹配,则处理,如果不匹配,则不进行处理。
看个小例子,就能秒懂,前提是建立在之前知识的基础之上。
如下图所示,test2文件中有3行文本,第一行有4列,第二行有5列,第三行只有2列。而下图的awk命令中,就使用到了一个简单的模式。
上图中,我们使用了一个简单的"模式",换句话说,我们使用了一个简单的"条件",这个条件就是,如果被处理的行正好有5列字段,那么被处理的行则满足"条件",满足条件的行会执行相应的动作,而动作就是{print $0},即打印当前行,换句话说,就是只打印满足条件的行,条件就是这一行文本有5列(NF是内置变量,表示当前行的字段数量,如果你忘了,那么请你重新看一遍之前的文章),而上例中,只有第二行有5列,所以,只有第二行能与我们指定的"模式"相匹配,最终也就只输出了第二行。
这就是所谓的"模式",其实很简单,对吧。聪明如你,应该已经能够举一反三了,举例如下。
没错,"模式"怎样写,取决于我们想要给出什么样的限制条件。
细心如你一定发现了,上图中使用的"模式"都有一个共同点,就是上述"模式"中,都使用到了关系表达式(关系操作符),比如 ==,比如<=,比如>,当经过关系运算得出的结果为"真"时,则满足条件(表示与指定的模式匹配),满足条件,就会执行相应的动作,而上例中使用到的运算符都是常见的关系运算符,我们就不解释了,那么awk都支持哪些关系运算符呢?我们来总结一下。
关系运算符 |
含义 |
用法示例 |
< |
小于 |
x < y |
<= |
小于等于 |
x <= y |
== |
等于 |
x == y |
!= |
不等于 |
x != y |
>= |
大于等于 |
x >= y |
> |
大于 |
x > y |
~ |
与对应的正则匹配则为真 |
x ~ /正则/ |
!~ |
与对应的正则不匹配则为真 |
x !~ /正则/ |
我们把这种用到了"关系运算符"的"模式"称之为:"关系表达式模式"或者"关系运算符模式"。
其实,在学习"模式"之前,我们一直都在使用"模式",只是我们没有感觉到而已,为什么这么说呢?听完下面的解释,你就会明白。
上图中的命令1指定了"模式",而且这种"模式"是"关系表达式模式",如果当前行的字段数量等于5,模式被匹配,对应的行被打印。
上图中的命令2貌似没有使用任何"模式",所以,每一行都执行了指定的动作,即每一行都被输出了,其实,这种没有被指定任何"模式"的情况,也是一种"模式",我们称这种情况为"空模式","空模式"会匹配文本中的每一行,所以,每一行都满足"条件",所以,每一行都会执行相应的动作。
现在,我们不仅懂得了什么是awk的"模式(Pattern)",而且还掌握了两种"模式",空模式和关系运算模式。
不对,我们似乎遗忘了什么 ,我们还用过BEGIN模式和END模式,我们来回顾一下吧。
BEGIN模式,表示在开始处理文本之前,需要执行的操作。
END模式,表示将所有行都处理完毕后,需要执行的操作。
还记得我们在第一篇awk博文中使用到的例子吗,温故知新,回过头看,会有新发现
上图中的示例用到了BEGIN模式,空模式,END模式。
其实,"模式"还有其他的"样子",只是我们今天还没有见识到而已,不过,今天的时光也没有白费,起码我们知道了"模式"的概念,以及如下三类"模式"
1、空模式
2、关系运算模式
3、BEGIN/END模式
笔者为了偷懒,今天就先到这里吧,等过两天,我们再看看模式的其他用法,再了解一下除了上述三类的其他类型的"模式"。
老规矩,求评论,求点赞,求收藏,求推荐~~~~各位客官,么么哒~~~~~
之一_files/2017-04-27-1720365637.png)
2020年5月30日 下午3:04 沙发
感谢博主,学无止境,加油
2020年4月29日 上午10:59 板凳
打卡 继续向博主跟进!动力源自于原来我是小白也能跟着学 哈哈!
2020年4月23日 下午6:20 地板
打卡,博主最帅,博主么么哒~
2020年2月8日 下午6:51 4楼
喜欢,希望博主大大能继续抽空写,写得太好了
2019年12月19日 下午12:31 5楼
入门精品.
2019年12月12日 上午11:08 6楼
谢谢博主,写的真棒。
2019年11月7日 下午5:49 7楼
朱老师,有意向授课Linux吗?您的文章写的太棒了,从放弃到入门很赞,有意向联系yc_uuu@163.com
2019年10月29日 下午4:58 8楼
2019年10月8日 下午6:18 9楼
博主你好,一个awk语句里可以同时使用两个关系运算模式吗,比如要匹配NR大于1,小于100的行,可以实现吗
2019年7月25日 下午2:29 10楼
你不去当老师是教育界的重大损失!!!!!!!!!
2019年6月19日 上午8:31 11楼
挺好的
2019年5月8日 上午12:28 12楼
写的太好了,真的是从放弃到入门的感觉,感谢博主,博主可以根据内容,增加一些实际应用场景的题目吗?这样会加深理解和记忆。
2019年4月11日 下午1:56 13楼
看了很多博主的文章,感谢!
2019年4月11日 下午4:30 1层
@夜雨 捧场了,能帮助到你就好,加油~
2019年3月25日 下午5:14 14楼
最近真的看了很多篇博主写的文章。真的是通俗易懂,学会了很多知识。非常感谢您的分享~~~
2019年3月21日 上午11:12 15楼
通俗易懂
2018年12月20日 下午7:24 16楼
博主辛苦了,受益匪浅,巩固,从细节看长远,受教了,感谢🙏
2018年11月22日 下午4:13 17楼
写的非常好,可以出书了,打卡!
2018年11月16日 下午4:46 18楼
我只想说,作者是我在网上上看inux技术点表达最“通俗易懂”的一个。看了几天你的AWK,感觉AWK真的很强大。作者在这上面花得功夫,真没话说。
很欣赏你写的linux文章, 如果可以,很希望能跟作者交个朋友,一起讨论讨论。我微信:zxcvedis
2018年11月16日 上午10:48 19楼
受益匪浅
2018年10月30日 下午5:16 20楼
博主awk系列写的非常好,最近刚好在复习awk用法,跟着博主的awk系列复习非常赞!还想问下,博主的博客是用什么建的?之一_files/icon_redface.gif)
2018年10月25日 下午11:07 21楼
写的真好 楼主多出点文章吧 特别是工作常用到的
2018年9月30日 下午2:59 22楼
感谢双印大官人
2018年10月1日 上午11:15 1层
@西门大官人 哈哈~西门大官人捧场~~
2018年9月18日 下午8:08 23楼
写的真好
2018年9月12日 下午5:41 24楼
为了偷懒,今天先讲到这里。。。。。。你为何如此优秀
2018年8月15日 下午5:48 25楼
第五篇点击下一篇后面跳到mysql的文章去了,索引不对了呀
2018年8月15日 下午5:46 26楼
写的很棒啊
2018年3月6日 上午9:58 27楼
这是我见过讲得最浅显易懂的awk课件。 赞楼主。么么哒
2018年3月6日 上午10:47 1层
@tjyuanxi 感谢捧场~
2017年12月21日 下午11:32 28楼
看了下,写得真的比较容易让掌握,多谢了,朱兄!
2017年7月28日 下午4:15 29楼
打卡!
模式:
1、空模式
2、关系运算模式
3、BEGIN/END模式
2017年7月28日 下午11:53 1层
@易知难 666,读书从厚到薄,再从博到厚,加油~~~
2017年7月19日 上午8:03 30楼
老铁的awk入门,简单易懂,适合我们这些小白,谢谢!
2017年6月21日 下午8:58 31楼
讲的beautiful
2017年6月21日 下午9:03 1层
@echo 兄弟,进度挺快~加油~
2017年6月22日 下午8:22 2层
@朱双印 不快呢 zabbix搞了三晚上都没装上 我暂时放弃了
2017年6月22日 下午8:27 3层
@echo 可能是遇到了一个点,暂时过不去,过两天放空重来,可能就好了
2017年5月20日 上午9:56 32楼
谢谢博主,学习了,坐等更新
2017年5月20日 上午11:00 1层
@GMFTBY 正在铺垫中哦~~
2017年5月9日 下午5:09 33楼
写的非常好,整体布局内容看得非常舒服
2017年5月9日 下午6:31 1层
@_ 谢谢客官夸奖~~
2018年7月6日 上午9:27 1层
@_ 的确是,我都感觉这个系列博客都可以做教材使用。条理清晰,结构分明,语言幽默。
继续关注,继续学习。
博主辛苦了,谢谢。
2017年5月5日 下午11:06 34楼
大神 写的很好啊,很容易让我理解
2017年5月5日 下午11:13 1层
@linux萌新 客官好,我也好,大家好才是真的好~之一_files/icon_mrgreen.gif)
2017年4月27日 下午11:09 35楼
大神期待更复杂的日志分析举例
2017年4月28日 上午8:55 1层
@期待更新 谢谢客官关注哦~~~,最近正在更新iptables,之所以没有更新awk是因为总结模式的时候想用正则表达式做举例,但是正则还没有更新,想把以前总结的正则跟grep放在一起写,但是这样一下就需要占用好多业余时间去写,所以决定暂时把iptables的写完,然后就开始写grep和正则,差不多的话awk就继续往后写,因为awk还有判断分支与循环什么的,所以肯定会往后写的,看来还是有同学在看awk的,我会尽快的,你的关注就是对我最大的肯定~~
2017年4月28日 上午9:12 1层
@期待更新 还有,忘了做广告了,关注我的微信公众号(文章下方有二维码),有新文章时可以第一时间得到通知哦~~~之一_files/icon_razz.gif)
2017年4月5日 下午4:26 36楼
作为转到linux的萌新,一口气看完了awk的系列,深入浅出,介绍的很细致,期待继续更新啊
2017年4月5日 下午4:43 1层
@期待作者大大继续发表研究成果 一直在努力的更新着,只是我一个人精力有限,平常也要工作,每写一片文章都在想怎样让这片文章更加通俗易懂,所以比较耗费时间,如果只是把之前的总结复制粘贴一下,那么一下就能多出来几百篇文章来,但是这样就会降低博客的质量,而且对于入门的朋友来说,就少了更多的帮助,翻翻之前的笔记,写的比较简单,估计只有我自己可以看懂,首先,非常感谢这位客官,如果没有你们捧场,我也不会有一直写博客的动力,以前的总结也不会再翻新了,你的肯定会让我写出更多的文章,希望这些文章能够帮到你,加油~
2017年4月1日 下午6:29 37楼
你好,看了你写的awk命令的相关知识,写的很详细,很通俗易懂,但是没有提到使用awk处理多个文件的,希望后续能写一下供大家学习参考
2017年4月1日 下午10:04 1层
@啊哈 好的~~
2017年3月30日 下午8:22 38楼
写的不错,循序渐进,解释的也很明白 很适合初学者学习
2017年3月30日 下午9:55 1层
@风影 谢谢肯定~~