详解

  1. 某些语句中,可能没有模式;

  2. 另一些语句中,可能没有动作及其大括号。

awk检查你的程序以确认不存在语法错误后,一次读取一行输入,并对每一行按序处理模式

  1. 对于每个匹配到当前输入行的模式,执行其关联的动作。

  2. 不存在模式,则匹配每个输入行,因此没有模式的每个动作对于每个输入行都要执行。

  3. 一个仅包含模式的模式-动作语句将打印匹配该模式的每个输入行。

程序的格式

模式-动作语句以及动作中的语句通常以换行分隔,如果它们以分号分隔,则多个语句可以出现在一行中。分号可以放在任意语句的尾部。

动作的开大括号必须与其对应的模式处于同一行;动作的其余部分,包括闭大括号,则可以出现接下来的行中。

空行会被忽略;一般为了提高程序的可读性会在语句的前面或者后面插入空行。在操作符和操作数的两边插入空格和制表符也是为了提高可读性。

任意行的末尾可能会有注释。注释以符号 # 开始,结束于行尾,就像这样

{ print $1, $3 }        # print country name and population
长语句可以跨越多行,但要在断行的地方加入一个反斜杠和一个换行符::

{ print \
                $1,             # country name
                $2,             # area in thousands of square miles
                $3 }    # population in millions

如上例所示,语句也可以逗号断行,在每个断行的末尾也可以加入注释。

模式

6种模式及其匹配条件。

  1. BEGIN { 语句 } 在读取任何输入前执行一次 语句

  2. END { 语句 } 读取所有输入之后执行一次 语句

  3. 表达式 { 语句 } 对于 表达式 为真(即,非零或非空)的行,执行 语句

  4. /正则表达式/ { 语句 } 如果输入行包含字符串与 正则表达式 相匹配,则执行 语句

  5. 组合模式 { 语句 } 一个 组合模式 通过与(&&),或(||),非(|),以及括弧来组合多个表达式;对于组合模式为真的每个输入行,执行 语句

  6. 模式1,模式2 { 语句 } 范围模式(range pattern)匹配从与 模式1 相匹配的行到与 模式2 相匹配的行(包含该行)之间的所有行,对于这些输入行,执行 语句 。

BEGIN和END不与其他模式组合。范围模式不可以是任何其他模式的一部分。BEGIN和END是仅有的必须搭配动作的模式。

几个例子

#从file文件中找出长度大于80的行
awk 'length>80' file

#按连接数查看客户端IP
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

#打印99乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

最后更新于

这有帮助吗?