Linux中的awk命令

1、什么是awk命令?
在上一节中我们讲了sed命令,我们知道sed命令是以行为基本单位来处理内容的,今天我们来讲一下awk命令。awk命令的与sed命令相比它不仅可以按行为单位处理还可以按列为单位处理文件。
awk是以一行消息为一条记录,每条记录为域。awk也是一种非编译的弱类型语言。
awk缺省的行分隔符是换行,缺省的列分隔符就是连续的空格和tab。awk实际上是一种很复杂的脚本语言,有像c语言一样的分支循环结构,但是它的基本用法是和sed类似的额。awk有很多内建的功能比如数组和函数等,这就是它和C语言的相同之处,灵活性就是awk最大的优势。
awk处理文件的方式:
awk处理的文件的方式是和sed类似的,它也是一行一行的处理文件,从第一行到最后一行都按照正则表达式进行匹配,如果匹配到的话就直接按照后面的处理方式来处理当前行,如果没有指定的匹配模式,那么每一行都执行这个操作。
2、awk的变量及参数
awk命令行的基本形式:

awk option ‘script’ file1 file2 …
awk option -f scriptfile file1 file2 …

awk编辑命令可以直接当命令行参数传入,也可以用-f参数指定一个脚本文件。编辑命令的格式为:/pattern/{actions}
和sed类似,pattern是正则表达式,而actions是后面要执行的一系列操作。awk一行一行的读出待处理的文件,如果某一行与pattern匹配或者是满足condition的条件,则执行相应的actions,如果一条命令只有actions部分,那么actions作用于待处理文件的每一行。
awk脚本的基本结构:

awk ‘BEGIN{ print “start” } pattern { commands } END{ print “end” }’ file
一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三部分都是可选的,任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中,例如:
awk ‘BEGIN{ i=0 } { i++ } END{ print i }’ filename
awk “BEGIN{ i=0 } { i++ } END{ print i }” filename

awk的工作原理:

awk ‘BEGIN{ commands } pattern{ commands } END{ commands }’

第一步:执行BEGIN{ commands }语句块中的语句
第二部:从文件或者标准输入读取一行,然后执行pattern{ commands }语句块,它会逐行扫描文件。从第一行到最后一行都重复这个过程,直到文件都被读取完毕。
第三步:当读至输入流末尾时,就会执行END{ commands }语句块。

BEGIN语句块在awk在开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量的初始化、打印输出表格的表头等语句,通常可以写在BEGIN语句块中。

END语句块在awk从输入流中 读取完所有的行之后即被执行,比如打印所有的分析结果这类的信息汇总都是在END语句块中完成的,它也是一个可选语句块。

pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行print也就是打印每一个读取到的行,awk读取的每一行都会执行该语句块。

awk的工作流程:
先执行BEGIN然后读取文件,读入有\n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域, 0 1表示第一个域,$n表示第n个域,然后开始执行模式所对应的动作action。接着读入第二条记录,直到所有的记录都读完,最后执行END操作。

awk中的print和printf:
awk同时提供了两种打印函数print和printf。
print函数的参数可以事变量、数值或字符串。字符串必须用双引号引用,参数用逗号分割。如果没有逗号,参数就串联在一起无法区分。这里逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数的作用和c语言里面的printf的作用是大致相同的,可以格式化字符串。在输出复杂的时候,printf更好用代码更加易懂。

3、awk的具体使用
1、打印第一列和第二列,分别用 1 2可以表示
Linux中的awk命令_第1张图片
2、用$0表示的是打印全部列
Linux中的awk命令_第2张图片
3、自定义列分割符,打印每一列
Linux中的awk命令_第3张图片
4、除了自动变量还有一个NF变量,默认输出最后一列
Linux中的awk命令_第4张图片
5、使用BEGIN和END来统计文件中的行数
Linux中的awk命令_第5张图片
6、统计某个文件下所有文件的size的总和
Linux中的awk命令_第6张图片
7、把“:”替换成“**”
Linux中的awk命令_第7张图片

你可能感兴趣的:(Linux,linux学习历程)