重要概念
记录(Records):记录默认以换行符为分割符,可以设置RS变量来更改分隔符,RS可以是单个字符也可以是字符串,当RS为空时,以空行分割。
域(Fields):每当一个记录被读取,awk使用FS变量作为分隔符将记录分割成域。FS可以是单个字符也可以是字符串,当FS为空时,每个字符为一个域。每个域的值可以通过它的位置$1、$2...引用,$0表示整个记录。
输出命令:print用于输出文本。其输出的文本总是以"输出记录分隔符"分割的,默认值为空格符。例如:print $1, $3显示当前记录的第1和第3个域,并以预定义的“输出域分隔符”分隔,其默认值为一个空格符。printf等同于C的格式化输出。
模式和动作:awk脚本是由模式和动作组成“pattern {action}” 两者皆是可选的,如果没有pattern,则action应用到全部记录。如果没有action,则输出所有匹配的记录。 例如:awk '/apple/{print $0}',pattern为匹配包含apple的记录,action为打印该记录。
内建变量
NR: 已输入记录的条数。(The total number of input records seen so far.)
NF: 当前记录中域的个数。(The number of fields in the current input record.)
FILENAME: 当前输入文件的文件名。
FS: 域分隔符。(input field separator)
RS: 记录分隔符。(input record separator)
OFS: 输出域分隔符。(output recode separator)
ORS: 输出记录分隔符。(output field separator)
OFMT: 输出数字格式(format for numeric output),其默认值为"%.6g。
模式和动作
模式可以是以下任意一个:
模式 | 描述 |
/正则表达式/ | 使用正则表达式匹配行,例如:awk '/apple/{print $0;}' |
关系表达式 | 使用关系运算符对字符串和数字进行比较操作, 例如:awk '$1>100 {print $1;}' |
模式匹配表达式 | 运算符 ~、~! 分别表示匹配、不匹配, 例如:awk '$1 ~ /apple/ {print $1;}' |
pattern1,pattern2 | 指定匹配行的范围,pattern 不能是 BEGIN、END 模式, 例如: awk '/apple/,/banana/{print $0;}' filename |
BEGIN | 第一条输入记录被处理之前所发生的动作, 例如:awk 'BEGIN{FS=":";}{print $1,$2;}' |
END | 最后一条输入记录被读取之后发生的动作, 例如: awk '{print $0;}END{print "total line number:",NR;}'
|
动作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。可以为以下任意一个:
动作 | 描述 |
变量赋值语句 | 包括数组赋值,例如:awk 'BEGIN{total=0}{print $1;total+=$1;}END{print total;}' |
输出语句 | print、printf 语句 |
流程控制结构语句 | if、for、while、do 结构 |
函数语句 | 包括内置函数 |
内置函数
内置函数太多,用的时候查找就行,下面附上内置函数的手册地址:
http://www.gnu.org/software/gawk/manual/gawk.html#Built_002din
AWK常用命令
Awk常用的单行命令,详见:
http://blog.youkuaiyun.com/xinhanggebuguake/article/details/8461002
参考:http://blog.sina.com.cn/s/blog_87edb13801015dko.html