一、awk简介
awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。 awk 是三剑客的老大,利剑出鞘,必会不同凡响。
Linux三剑客:
(1)grep:适合单纯的查找和匹配文本。
(2)sed:适合编辑匹配到的文本。
(3)awk:适合格式化文本,对文本进行较复杂的格式处理。
二、awk基础:action
<语法>
awk [options] 'program' file1 , file2 , ```
awk [options] 'Pattern{Action}' file
2.1通过Action了解awk:
<例子1>awk最常用的就是print和printf功能,例子中使用awk打印功能,将test_awk.txt文件中的内容打印出来。
<例子2>实际场景来使用awk功能。上图中的awk '{print $1}',表示输出df的信息的第1列,$1表示将当前行按照分隔符分割后的第1列,不指定分隔符时,默认使用空格作为分隔符,细心的你一定发现了,上述信息用的空格不止有一个,而是有连续多个空格,awk自动将连续的空格理解为一个分割符了。
$0 表示显示整行 ,$NF表示当前行分割后的最后一列($0和$NF均为内置变量)注意,$NF 和 NF 要表达的意思是不一样的,对于awk来说,$NF表示最后一个字段,NF表示当前行被分隔符切开以后,一共有几个字段。也就是说,假如一行文本被空格分成了7段,那么NF的值就是7,$NF的值就是$7, 而$7表示当前行的第7个字段,也就是最后一列,那么每行的倒数第二列可以写为$(NF-1)。
<例子2-1>awk '{print $1,$2}' test_awk.txt #打印test_awk.txt文件中第1列和第2列的内容。
<例子2-2>awk '{print $NF}' test_awk.txt #表示将文本中最后一列打印出来
<例子2-3>awk '{print $(NF-1)}' test_awk.txt #表示将文本中倒数第二列的内容打印出来
<例子2-4>awk '{print $0}' test_awk.txt=awk '{print}' test_awk.txt #表示将文本中的所有内容打印出来
<例子3>可以自己添加字段,并与文件中的内容拼接
awk '{print $1,$2,"string"}' test_awk.txt
awk '{print $1,$2,666}' test_awk.txt
awk '{print "diyilie",$1} {print "dierlie",$2}' test_awk.txt
三、awk基础:pattern
AWK 包含两种特殊的模式:BEGIN 和 END。
(1)BEGIN 模式:指定了处理文本之前需要执行的操作
(2)END 模式:指定了处理完所有行之后所需要执行的操作
3.1BEGIN 模式案例
awk 'BEGIN{print "bg_name","bg_gender"} {print $1,$2}' test_awk.txt #表示在执行打印第1列和第2列的动作前先执行BEGIN中的打印动作
3.2END模式案例
awk '{print $1,$2} END{print "end_name","end_gender"}' test_awk.txt #表示在执行打印第1列和第2列的动作后再执行END中的打印动作
【参考大佬:http://www.zsythink.net/archives/1336】