awk是Linux下经常用到的资料处理工具,一般用来处里行结构比较统一的资料。前面讲到的资料处理工具sed是一行为单位来处理资料,而awk是按行把资料按照一定的字符(预设是空格和TAB)分栏,然后按栏为单位处理。和excel里的分裂比较类似。
usage:awk '条件1{动作1} 条件2{动作2} 条件3{动作3}......' filename
只有条件成立了才会执行相应的动作,即条件1成立就执行动作1,接着判断条件2,依次往后直至所有条件都判断完毕。
awk对资料分栏后,每一栏就对应着一个变量,第一栏对应变量$1,第二栏对应变量$2依次类推,变量$0对应整行。awk处理资料的流程如下:
读入第一行,按设定的分隔符把第一行分栏,将处理的资料填入相应的变量$0,$1,$2......
判断条件1是否成立,决定是否执行动作1,然后判断条件2是否成立决定是否执行动作2,依次下去,直至所有的条件和动作都判断执行完毕;
若有后续的行资料,则重复前面2步动作,直至所有的资料都处理完毕为止;
下面几个awk的内建变量最好牢记:
变量名称 | 代表的意义 | |
NF | 每一行拥有的栏位总数 | |
NR | 当前处理的是第几行 | |
FS | 目前的分隔符,预设为空白键 |
awk的逻辑运算符
awk中能够使用的逻辑运算符如下:
运算符 | 含义 | |
> | 大于 | |
< | 小于 | |
>= | 大于等于 | |
<= | 小于等于 | |
== | 等于 | |
!= | 不等于 |
示例:
对/etc/passwd文件进行处理,取出当中的用户名和用户id
上图可见第一行不是想要的结果,是因为在设置FS=":"生效之前,第一行已经按默认的分隔符处理了,正确的处理方法如下:
如果只想显示前5行,可以如下处理: