用awk处理过一些文本,发现确实是一个非常好用的工具。
基本命令:
awk [-F re] [parameter...] ['prog'] [-f progfile]-F re: 修改字段分隔符
‘prog’: awk语言片段,'pattern {action}', 二者必须有一个有值,缺省action是打印。
-f progfile: awk语言文件。
简单示例:
1. 打印test.txt含有keywords的行。
awk '/keywords/' test.txt
2. regex指定范围
awk '/keyword1/,/keyword2/ ' test.txt
内建变量:
- 域变量:$1, $2 ... $N, 一条记录分隔出来的各个域的值。$0指整条记录。
- NR: 已输入记录的条数。
- NF: 当前记录中域的个数。记录中最后一个域可以以
$NF
的方式引用。 - FILENAME: 当前输入文件的文件名。
- FS: “域分隔符”,用于将输入记录分割成域。其默认值为“空白字符”,即空格和制表符。FS可以替换为其它字符,从而改变域分隔符。
- RS: 当前的“记录分隔符”。默认状态下,输入的每行都被作为一个记录,因此默认记录分隔符是换行符。
- OFS: “输出域分隔符”,即分隔
print
命令的参数的符号。其默认值为空格。 - ORS: “输出记录分隔符”,即每个
print
命令之间的符号。其默认值为换行符。 - OFMT: “输出数字格式”(Format for numeric output),其默认值为"%.6g"。
语法:
BEGIN {文件开始后处理}
#注释
#无需;结尾
END {文件结束时处理}
变量和函数:
variable_name: 关键字除外的数字,字母,下划线
variable_name = value
function func_name (parameter) {
return value;
}
复杂示例:
1. 输出单词计数
{
w += NF
c += length + 1
}
END { print NR, w, c }
2. 计算单词出现频率
# Print list of word frequencies
{
for (i = 1; i <= NF; i++)
freq[$i]++
}
END {
for (word in freq)
printf "%s\t%d\n", word, freq[word]
}
一个不错的中文学习笔记: http://man.lupaworld.com/content/manage/ringkee/awk.htm
英文文档: http://www.gnu.org/software/gawk/manual/gawk.htm