awk

发表于:,更新于:,By Guodong
大纲
  1. 1. 模式
  2. 2. pattern
  3. 3. action
  4. 4. 内置变量
  5. 5. awk的逻辑运算字符
  6. 6. awk计算
  7. 7. 总结

此处来自ubuntu下man awk。
awk语法比较复杂,本文介绍awk语法规则,不会对所有语法一一列举。

模式

来自awk:
An AWK program is a sequence of pattern {action} pairs and user function definitions.

实际上:

1
awk 'pattern1{action1} pattern2 {action2} ...' filename

pattern和action可以省略一个。
pattern省略时,暗示匹配所有。action省略时,默认print。
当pattern为特殊pattern,BEGIN和END时,action不能省略。

pattern

来自awk:
A pattern can be:
BEGIN
END
expression

BEGIN和END是两种特殊的pattern。

如BEGIN,$3 < 10。FS可以设置分隔符,$3 < 10中使用了逻辑运算符,后面会详细介绍。

1
2
3
4
5
6
7
8
9
10
11
cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
root 0
daemon 1
bin 2
sys 3
sync 4
games 5
man 6
lp 7
mail 8
news 9

action

如print:

1
2
3
4
5
6
last | head -n 5 | awk '{print $1 "\t" $3}'
root 119.40.0.58
root 119.40.0.58
root 119.40.0.58
root 119.40.0.58
root 119.40.0.58

多个action使用英文分号或换行分隔:

1
2
3
4
5
6
last | head -n 5 | awk '{v=$1"\t"$3;print v}'
root 119.40.0.58
root 119.40.0.58
root 119.40.0.58
root 119.40.0.58
root 119.40.0.58

内置变量

发量名称 代表意义
NF 每行$0拥有的字段总数
NR 当前处理的行数
FS 目前使用的分隔符


如:

1
2
last -n 1| awk '{print $1 "\t lines: " NR "\t columes: " NF}'
root lines: 1 columes: 10

在普通情况下awk ‘BEGIN{FS=”:”}…’等价于awk -F “:” ‘…’,另外,分隔符可以使用正则。
例如:

1
2
last -n 1| head -n 1 | awk '{print $1 "-lines:" NR "-columes:" NF}' | awk 'BEGIN {FS="[:|-]"}{print $1,$2,$3,$4,$5}'
root lines 1 columes 10

等价于

1
2
last -n 1| head -n 1 | awk '{print $1 "-lines:" NR "-columes:" NF}' | awk -F "[:|-]" '{print $1,$2,$3,$4,$5}'
root lines 1 columes 10

awk的逻辑运算字符

符号 含义
> 大于
< 小于
>= 大于或等于
<= 小于或等于
== 相等
!= 不相等

awk计算

awk可以实现计算功能,例如pay.txt中列出每个人三个月的薪资,现在我们计算出他们的总薪资。

1
2
3
4
Name 1st 2nd 3th
VBird 23000 24000 25000
DMTsai 21000 20000 23000
Bird2 43000 42000 41000

注意,在一个action中出现多个expression,可以用分号或者直接换行分隔。

1
2
3
4
5
6
7
root@master:~# cat pay.txt | awk 'NR==1{printf "%10s%10s%10s%10s%10s\n",$1,$2,$3,$4,"Total"}
NR>1{total=$2+$3+$4
> printf "%10s%10s%10s%10s%10s\n",$1,$2,$3,$4,total}'
Name 1st 2nd 3th Total
VBird 23000 24000 25000 72000
DMTsai 21000 20000 23000 64000
Bird2 43000 42000 41000 126000

总结

awk涉及的内容较多,
如awk的内置函数,length(s),tolower(s)等等,也可以自定义函数;
以及程序分支控制,例如if,while,for。
当然,awk能做的事情还有很多,比如多行文本处理。

这里由于本人水平有限就不一一介绍了,不过学习命令使用最好的方法就是去查看linux的命令手册,也就是man命令。