Awk 使用教程和使用案例
本文是Awk command tutorial in linux/unix with examples and use cases的部分译文
AWK 是一个处理文本的工具。
最简单也最常用的用法的就是来获取某些文本的第N列,例如:
# file data
1 Tony 18
2 Jenny 20
$ awk '{ print $2 }' data
Tony
Jenny
AWK 的命名是取3个发明者Alfred Aho, Peter Weinberger 和Brian Kernighan名字首字母的缩写 。
AWK 内置了一种简单的脚本语言来帮助处理数据。这种语言支持变量、函数、用户自定义函数还有很多逻辑操作符。利用这个脚本语言,awk可以实现很多使用的功能
awk [options] 'pattern{ commands } file'
awk [-F|-f|-v] '
BEGIN{ commands }
pattern{ commands }
END{ commands }' file
-F: 指定分隔符
-F’[:#|]’: 可以定义多种分隔符
-f: 指定脚本
-v: 定义变量 var=value
pattern { action }
action类似于其他脚本语言,包含了if for while等基础的关键字
if( expression ) statement [ else statement ]
while( expression ) statement
for( expression ; expression ; expression ) statement
for( var in array ) statement
do statement while( expression )
break
continue
{ [ statement ... ] }
expression # commonly var = expression
print [ expression-list ] [ > expression ]
printf format [ , expression-list ] [ > expression ]
return [ expression ]
next # skip remaining patterns on this input line
nextfile # skip rest of this file, open next, start at top
delete array[ expression ]# delete an array element
delete array # delete all elements of array
exit [ expression ] # exit immediately; status is expression
awk支持用户自定义函数,一般放置在BEGIN前
function foo(a, b, c) { ...; return x }
一个awk脚本通常包含3个部分:BEGIN,BODY和END。
这3个部分都是可选的。
BEGIN 执行在读取输入之前,一般用来初始化变量和打印输出的表头或者其他辅助信息。
END 执行在读取完所有输出之后,可以用来打印一些总结统计类的信息。
BODY 包含了常用的命令,是最主要的一块。如果一个awk命令中没有BODY部分,那么BODY会默认通过{print}输出整行的记录。
+ - * / % ^ ! ++ -- += -= *= /= %= ^= > >= < <= == != ?:
这两种匹配的区别就是:
array[index]=value
数组不需要先声明再使用,而且index可以为任意字符,这点有点类似字典。如果index为字符,需要加上双引号。
还有awk的数组不支持多维数组,但可以利用index来模拟。留意这里也不需要加双引号。
array[1,1]=0
以下的例子为显示/usr/bin目录下的应用的原始文件位置:
$ ls -l /usr/bin | awk '
BEGIN {
print "Directory Report"
print "================"
}
NF > 9 {
print $9, "is a symbolic link to", $NF
}
END {
print "============="
print "End Of Report"
}
'
其中NF > 9
代表只有字段数量大于9的行才会执行BODY内的命令。
算术函数: exp, log, sqrt, sin, cos, and atan2
其他自带函数:
通常我们使用SQL来实现group by+count来归类统计某类数据,而通过awk也可以轻松实现这个功能。
示例数据:
id,name,sex
1,Tony,male
2,Jenny,female
3,Jack,male
统计男女性的人数:
awk -F, '
BEGIN {
print "---------"
print "sex total"
}
NR > 1 {
counter[$3]++
}
END {
print "male: ", counter["male"];
print "female: ", counter["female"]
}' data
以上述的数据为例,假设这段数据是包含在一个很长的文本中
...
UserData
id,name,sex
xxx
final: xxx
...
并且数据前后有明显的标识符,那么我们就可以直接使用字符匹配模式来匹配这段数据
/UserData/, /final/ { counter[$3]++ }