AWK编程语言
awk 'program' files
单引号部分是程序.AWK程序结构由条件和行为构成,英文原文是pattern{action}(模式-动作),但我觉得条件和行为更满足我的理解.
awk程序内容由多条语句构成,中间用分号隔开.
行为
内建变量
打印整行 $0 代表一整行,默认也会打印一整行
awk '{ print $0 }'
awk '{ print }'
打印某一列,默认是按空白字符分列的.NF代表列的数目,$NF代表最后一列对应的内容
指定列的位置: 1....
指定列倒数的位置: (NF-1)
awk '{ print $1 }'
awk '{ print $NF }'
[root@localhost ~]# echo 'A B' | awk '{ print $1 $2}'
AB
[root@localhost ~]# echo 'A B' | awk '{ print $NF $(NF-1) }'
BA
打印行号,NR代表行,将line放在中间输出
awk '{ print $1 "line" NR}'
[root@localhost ~]# echo -e "A\nB" | awk '{ print $0,"line",NR }'
A line 1
B line 2
指定分隔符
指定单个分隔符时跟在-F后,指定多个分隔符需要[]
awk -F[]
[root@localhost ~]# echo 'A:B' | awk -F: '{ print $1 }'
A
[root@localhost ~]# echo 'A:-:B' | awk -F[-:] '{ print $1 }'
A
格式化输出
类似c语言的printf形式:printf(format,v1,v2,v3..)
awk '{printf("%s",$0)}'
[root@localhost ~]# echo -e "A\nB" | awk '{printf("line %d:%s\n",NR,$0)}'
line 1:A
line 2:B
排序
内置排序asort 是丢弃键仅对数组的值进行排序,asorti仅对数组的键进行排序。
asorti(a,b) #生成排序数据b 遍历b for(i in b) print b[i],a[b[i]]
asort(a) #在a上进行排序 遍历a for(i in a) print i,a[i]
[root@localhost ~]# cat file
D 4
A 3
C 5
B 1
[root@localhost ~]# awk '{arr[$1]=$2};END{asort(arr);for(i in arr)print i,arr[i] }' file
1 1
2 3
3 4
4 5
[root@localhost ~]# awk '{arr[$1]=$2};END{asorti(arr,tmp);for(i in tmp)print tmp[i],arr[tmp[i]] }' file
A 3
B 1
C 5
D 4
建议使用sort进行排序,-k指定列,-r翻转,-n 以数字排序
[root@localhost ~]# awk '{print $1,$2}' file | sort -k 1
A 3
B 1
C 5
D 4
[root@localhost ~]# awk '{print $1,$2}' file | sort -k 1 -r
D 4
C 5
B 1
A 3
[root@localhost ~]# awk '{print $1,$2}' file | sort -k 2 -n
B 1
A 3
D 4
C 5
[root@localhost ~]# awk '{print $1,$2}' file | sort -k 2 -d -r
C 5
D 4
A 3
B 1
条件
内建变量
BEGIN,END是条件,在程序开始/结束时成立.
awk 'BEGIN{print "begin"};{ print $0,"line",NR };END{print "end"}'
[root@localhost ~]# echo -e "A\nB" | awk 'BEGIN{print "begin"};{ print $0,"line",NR };END{print "end"}'
begin
A line 1
B line 2
end
使用正则表达式
匹配上的行才会进行处理
[root@localhost ~]# cat file
DAN 11
DS 12
DD 13
A 1
BDB 2
[root@localhost ~]# awk '/^D/{ print $0 }' file
DAN 11
DS 12
DD 13
比较
可以使用各种运算符如>,<,==等进行判断
$1 == "A"
[root@localhost ~]# awk '$1=="A"{print $0}' file
A 3
$2 >= 3
[root@localhost ~]# awk '$2>=3{print $0}' file
D 4
A 3
C 5
可以使用逻辑运算符进行组合||,&&,!