awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能
代码块 | awk的所有代码(目前这么认为)都是写在语句块中的。 语句块可分为3类: BEGIN语句块、END语句块和main语句块。 其中BEGIN语句块和END语句块都是的格式分别为BEGIN{...}和END{...},而main语句块是一种统称,它的pattern部分没有固定格式,也可以省略,main代码块是在读取文件的每一行的时候都执行的代码块。 BEGIN代码块: 在读取文件之前执行,且执行一次 读取文件时循环执行,(默认情况)每读取一行,就执行一次main代码块 在读取文件完成之后执行,且执行一次 | |||||||||
语法 | awk [options] 'pattern{action}' file1 fiel1 awk的语法: 多个pattern{action}可以直接连接连用
| |||||||||
工作原理 | # awk-F: {print $1,$3}' /etc/passwd (1)awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一一个记录,以换行符结束 (2)然后,行被: (默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始,最多达100个字段 (3)awk如何知道用空格来分隔字段的呢?因为有一个内部变量FS来确定字段分隔符。初始时,FS赋为空格 (4)awk打印字段时,将以设置的方法使用print西数打印,awk在打印的字段间加上空格,因为$1,$3之间有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符OFS, OFS默认为空格 (5)awk输出之后,将从文件中获取另行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕 | |||||||||
变量 | RS | 可设置表示输入记录分隔符的预定义(Record Separator)来改变每次读取的记录模式。 RS通常设置在BEGIN代码块中,因为要先于读取文件就确定好RS分隔符。 RS指定输入记录分隔符时,所读取的记录中是不包含分隔符字符的。例如RS="a",则$0中一定不可能出现字符a 特殊的RS值用来解决特殊读取需求: RS="":按段落读取 RS两种可能情况: | ||||||||
RT | 在读取每条记录之后,将其赋值给$0,同时还会设置NR、FNR、RT。 在awk每次读完一条记录时,会设置一个称为RT的预定义变量,表示Record Termination。 当RS为单个字符时,RT的值和RS的值是相同的。 当RS为多个字符(正则表达式)时,则RT设置为正则匹配到记录分隔符之后,真正用于划分记录时的字符。 当无法匹配到记录分隔符时,RT设置为控制空字符串(即默认的初始值)。 | |||||||||
NR | 在读取每条记录之后,将其赋值给$0,同时还会设置NR、FNR、RT。 所有文件的行号计数器 | |||||||||
FNR | 在读取每条记录之后,将其赋值给$0,同时还会设置NR、FNR、RT。 是各个文件的行号计数器 | |||||||||
字段分割 | awk读取每一条记录之后,会将其赋值给$0,同时还会对这条记录按照预定义变量FS划分字段,将划分好的各个字段分别赋值给$1 $2 $3 $4...$N,同时将划分的字段数量赋值给预定义变量NF $N引用字段: N=0:即$0,引用记录本身 方式: 读取record之后,将使用预定义变量FS、FIELDWIDTHS或FPAT中的一种来分割字段。分割完成之后,再进入main代码段(所以,在main中设置FS对本次已经读取的record是没有影响的,但会影响下次读取)。
有FS、FIELDWIDTHS、FPAT三种获取字段的方式,可使用PROCINFO数组来确定本次使用何种方式获得字段。 PROCINFO是一个数组,记录了awk进程工作时的状态信息。 如果: PROCINFO["FS"]=="FS",表示使用FS分割获取字段 |
ARGV 数组,保存命令行本身这个字符串,如awk '(print 50)' a.txt,这个命令中,ARGV[0]保存awk ARGV[1]保存a.txt:
ARGC awk命令的参数的个数 FILENAME awk命令所处理的文件的名称
ENVIRON:当前环境变量及其值的关联数组
自定义变量test : awk -v test="test" 'begin{print test}' awk 'begin{ test="test";print test}'
-----------格式化输出printf
format格式的指示符都以开头,后跟一个字符:
%c:显示字符的ASCII码 %d, %i点十进制整数 %e,%E:科学计数法显示数值 %f:显示浮点数
%g,%G:以科学计数法的格式或浮点数的格式显示数值 %s:显示字符串 %u:无符号整数 %%显示%自身
修饰符
N:显示宽度 -: 左对齐 +:显示数值符号
awk -F :'{printf "%-15s %i\n",$1,$3}' /etc/passwd
--------------内置函数
length 返回string字符 キ中字符的个数
awk -F : ‘{i1,while(i<NF){if(length)}}