awk简介
awk主要用于文本处理,并将处理后的结果生成报告。awk 语法与C, python, bash尤为相似(awk 在python, bash之前就已经存在了)。其名称来自它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母相连。比较经典的使用场景:应用日志分析。
awk命令
最简单的输出命令:
|
|
上述命令中, 将/etc/passwd作为输入文件,命令为’{print}’ 。当执行awk时, 它默认把每一行看做一个处理单元,根据命令参数及action(如何处理每行分块后的结果)对每一行按序处理, action中{print $0}等价于{print}都会打印出整行。
按照特定分隔符, 将每行切分(可以认为将每行切分的内容装入一个数组中):
|
|
执行awk脚本:
一般简单的文件处理用命令行会很方便, 但是如果遇到复杂的文件处理, 可能需要很复杂的多行命令处理, 这时将复杂处理写到脚本,直接调用脚本即可。
|
|
myscript.awk脚本:
|
|
命令中的BEGIN 和 END块
一般,awk会对文件中的每一行执行代码块。有一种情况是使用awk处理文本之前,执行变量初始化, 这时就需要BEGIN 块。使用BEGIN块可以设置FS(域分隔符), OFS (输出分隔符)或者初始化其他全局变量。
初始化全局变量:
|
|
在awk中的正则表达式
在awk中使用正则表达式,筛选符合正则的行,正则表达式使用斜杠/包起来:
|
|
比较表达式:
|
|
条件表达式:
|
|
awk内置变量:
- FS(Field Separators) 设置每行的分隔符:
|
|
- NF(Number of fields) 每行按特定分隔符分隔后,获取分隔块的数目,即数组大小:
|
|
- NR(Record Number)获取当前记录的行号:
|
|