awk
此处来自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 | cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}' |
action
如print:1
2
3
4
5
6last | 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
6last | 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
2last -n 1| awk '{print $1 "\t lines: " NR "\t columes: " NF}'
root lines: 1 columes: 10
在普通情况下awk ‘BEGIN{FS=”:”}…’等价于awk -F “:” ‘…’,另外,分隔符可以使用正则。
例如:1
2last -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
2last -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
4Name 1st 2nd 3th
VBird 23000 24000 25000
DMTsai 21000 20000 23000
Bird2 43000 42000 41000
注意,在一个action中出现多个expression,可以用分号或者直接换行分隔。1
2
3
4
5
6
7root@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命令。