awk 也是一个非常棒的数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个『字段』来处理

[root@www ~]# awk '条件类型1{动作1} 条件类型2{动作2} ...' filename

[root@www ~]# last -n 5 | awk '{print $1 "\t" $3}'

$0 $1, $2...

整个 awk 的处理流程是:

  1. 读入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中;

  2. 依据 "条件类型的限制,判断是否需要进行后面的 "动作"

  3. 做完所有的动作与条件类型;

  4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。

变量名称

代表意义

NF

每一行 ($0) 拥有的字段总数

NR

目前 awk 所处理的是『第几行』数据

FS

目前的分隔字符,默认是空格键

[root@www ~]# last -n 5| awk '{print $1 "\t lines: " NR "\t columes: " NF}'
cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
cat pay.txt | \
> awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" }
NR>=2{total = $2 + $3 + $4
printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'

上面的例子有几个重要事项应该要先说明的:

  • awk 的指令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号『;』间隔,或者直接以 [Enter] 按键来隔开每个指令,例如上面的范例中,鸟哥共按了三次 [enter] 喔!

  • 逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『==』!

  • 格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行!

  •  bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。

[root@www ~]# cat pay.txt | \
> awk '{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
NR>=2{total = $2 + $3 + $4
printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'