Linux九阴真经之无影剑残卷14(文本三剑客之awk)

awk

awk是一个报告生成器,它拥有强大的文本格式化能力,这是专业术语。

你可能不理解所谓的所谓的报告生成器中的“报告”是什么?你可以吧“报告”理解为报表或者表格,也就是说,我们可以利用awk命令,将一些文本整理成我们想要的样子,比如把一些文本整理成表的样子,然后再展示出来,刚才概念中提到的“文本格式化的能力”,也就是这个意思。如果还不理解,不用着急,当你看到后面的示例时,自然会明白awk所擅长的“文本格式化”能力是什么。

awk早期是在unix上实现的,所以我们现在在linux的所使用的awk其实是gawk,也就是GUN awk ,简称为gawk;awk还有一个版本,New awk , 简称为nawk, 但是linux中最常用的还是gawk。

grep、 sed 、awk  被称为linux中的“三剑客”

我们总结一下这三个“剑客”的特长

grep 更适合单纯的查找或匹配文本

sed 更适合编辑匹配到的文本

awk 更适合格式化文本,对文本进行较复杂格式处理

awk基础

awk基本语法如下,看不懂没关系,我们会慢慢举例。

awk [options] 'program' file1,file2,'''

对于上述语法中的program来说,又可细分为pattern和action,也就是说,awk的基本语法如下

awk [options] 'Pattern{Action}' file

从字面意思上理解,action指的就是动作,awk擅长文本格式化,并且将格式化以后的文本输出,所以awk最常用的动作就是print和printf,因为awk要把格式化完成后的文本输出啊,所以这2个动作最常用。

我们先从最简单的用法开始了解awk,先不适用[optioins],也不指定pattern, 直接适用最简单的action,从而开始认识awk,示例如下

上图中,我们只是适用awk执行了一个打印的动作,将aaa文件中的内容打印出来

现在 我们来操作另一个类似场景

上图中的awk '{print $5}' 表示输出df的信息的第5列,$5表示将当前行按照分隔符分割后的第5列,不指定分隔符时,默认适用空格作为分隔符,信心的你一定发现了,上图用的空格不止有一个,而是有连续多个空格,awk自动将连续的空格理解为一个分隔符了,是不是比cut命令要简单的多?

 awk是逐行处理的,逐行处理的意思就是说,当awk处理一个文本是时,会一行一行进行处理,处理完当前行,再处理下一行,awk默认以“换行符”为标记,识别每一行,也就是说awk根我们人类一样,每次遇到“回车换行”,就人为是当前行的结束,新的一行开始,awk会按照用户指定的分隔符取分割当前行,如果没有指定分隔符,默认使用空格作为分隔符。

$0表示整行,$NF表示当前行分割后的最后一列($0和$NF均为内置变量)

注意,$NF和NF 的意思是不一样的,对于awk来说,$NF表示最后一个字段,NF表示当前行被分隔符切开以后,一共有几个字段。

也就是说,假如一行文本被空格分成了7段,那么NF的值就是7,$NF的值就是$7,而$7表示当前行的第7个字段,也就是最后一列,那么每行的倒数第二列可以写为$(NF-1)

我们也可以一次输出多列,使用逗号隔开要输出的多个列,如下,一次性输出第一列和第二列

[root@laobai ~#awk '{print $1,$2}' test
abc 123
8ua 456

同理,也可以一次性输出多个指定的列,如下图

[root@laobai ~#awk '{print $1,$5}' test
abc 
8ua 7y7


我们发现,第一行没有第五列,所以并没有输出第五列的文本,而第二行有第五列,所以有输出

除了输出文本中的列,我们还能添加自己的字段,将 自己的字段与文件中的列结合

从上述实现中可以看出,awk 可以灵活的将我们指定的字符与每一列进行拼接,或者把指定的字符当做一个新列插入到原来的列中,也就是awk格式化文本能力的体现。

但是要注意,$1 这种内置变量的外侧不能加入双引号,否则$1会被 当做文本输出,如下图

我们也可以整行输出,如下两种发方法都表示输出整行

awk包含两种特殊模式:BEGIN和END

BEGIN模式指定了处理文本之前需要执行的操作

END模式指定了处理完所有行之后所需要执行的操作

BEGIN示例

如果我们想要awk先执行BEGIN模式指定的动作,再根据我们自定义的动作去操作文本,方法如下

聪明的你一定明白了,END模式就是在处理完所有的指定文本之后,需要指定的动作;那么我们可以结合BEGIN模式和END模式一起使用,示例

猜你喜欢

转载自www.cnblogs.com/huxiaojun/p/9048577.html