awk
第一条命令探路
原 /etc/passwd 数据:
awk -F’:’ ‘{print $1,$2,$6}’ /etc/passwd
意思很明显:将/etc/passwd文件中的数据,先以":"分割,然后取第1、第2、第6列,打印出来。
-F’:’ 指定冒号为分割符
==’{print $1,$2,$6}’==脚本代码块
执行脚本中的 BEGIN \ END模块
一般地,对每个输入行,awk 都会将脚本代码块执行一遍。然而在很多编程情况下,我们希望在整个过程中只执行一次初始化代码和结束收尾代码,也可以不用。对应的在awk中指的就是BEGIN \ END模块。通常情况下,使用BEGIN 模块初始化 FS(字段分隔符)变量、打印页眉或初始化其它全局变量,而END模块则用来做汇合计算、打印页脚或其他释放资源的工作。
运算符
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值语句 |
|| | 逻辑或 |
&& | 逻辑与 |
~ !~ | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
+ - | 加,减 |
* / & | 乘,除,求余 |
+ - ! | 加,减,逻辑非 |
^ *** | 求幂 |
++ – | 自加,自减 |
$ | 字段引用 |
空格 | 字符串链接符 |
?: | 三目运算符 |
In | 数组中是否存在某键值 |
使用举例:
- awk ‘BEGIN{a = 5;a += 5;print a}’
- awk ‘BEGIN{a = 1;b = 2;print (a > 2 && b > 1,a = 1 || b > 1)}’
- awk ‘BEGIN{a=“100testaaa”;if(a~/100/){print “ok”}}’
- awk ‘BEGIN{a=11;if(a>=9){print “ok”}}’
- awk ‘BEGIN{a=“b”;print a++,++a}’
- awk ‘BEGIN{a=“b”;print a==“c”?“ok”:“err”}’
内置变量
变量名 | 属性 |
---|---|
$0 | 当前整行 |
$1~$n | 当前行的第 n 个字段 |
FS | 输入字段分隔符,默认是空格 |
RS | 输入记录分割符,默认为换行符 |
NF | 当前行中的字段个数,也就是有多少列 |
NR | 已经读出的记录数,就是行号,从 1 开始 |
OFS | 输出字段分隔符,默认也是空格 |
ORS | 输出的记录分隔符,默认为换行符 |
使用举例:
- awk ‘BEGIN{FS="\t"}{print $1,$2,$3}’ data.txt
FS指定tab为分隔符
- awk ‘BEGIN{FS="[[:space:]+]"}{print $1,$2,$3}’ data.txt
默认空格
- awk ‘BEGIN{FS="[[:space:]+]"}NF=2{print $1,$2,$3}’ data.txt
awk ‘BEGIN{FS="[[:space:]+]"}NF=3{print $1,$2,$3}’ data.txt
NF指定列的数量
- awk ‘BEGIN{FS="[[:space:]+]"}NR&