Linux 命令 - awk

1 awk 与 grep 的联系与区别

两者都是来处理标准输入或者文本的。

grep 是以行为单位进行处理。不过,awk 的处理粒度更细一点,它首先将每一行通过分隔符划分成多个域(field,\$1 代表第一个域,\$2 代表第二个域,等等。\$0 代表这一行分隔前的情形)。然后以域为基本单位进一步处理。

2 awk

调用形式为:
awk 'BEGIN{commands} pattern{commands} END{commands}' file

其中:

  • BEGIN{commands} 表示执行 awk 命令开始前要执行的命令。可以省略;
  • pattern{commands} 这是在执行 awk 命令过程中执行的,表示根据 pattern 这个正则表达式(不支持 {n,m} 这种扩展的正则表达式)进行匹配,然后执行后面给出的命令。其中,pattern 要用 /xxx/(定界符号)包裹起来;
  • END{commands} 表示执行完 awk 命令后要执行的命令。可以省略。

默认情况下,以空格作为域分隔符。不过也可以通过 -F 参数指定一个字符或者一个字符串作为域分隔符。

比如:

1
2
3
4
5
6
7
8
9
10
# abc: cde
# hello: nju
# hello: world
# hello: bye
cat b_2.txt
# lineno: 2 1: hello 2: nju
# lineno: 3 1: hello 2: world
# lineno: 4 1: hello 2: bye
awk -F ": " '/hello/{printf("lineno: %s 1: %s 2: %s\n",NR,$1,$2)}' b_2.txt'

其中,printf 是 C 语言中的打印函数。NR (Number of Rows) 代表当前已匹配的行数,因此可以用它来记录行号。另外,NF (Number of Fields) 代表当前行所划分出的域的个数。


Reference