awk

Print Command

默认,awk print命令(不带任何参数)打印显示全部记录。下面例子等同于 cat employee.txt 命令。

$ cat employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
$ awk '{print}' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

你也可以打印记录里的指定字段 通过$field-number作为打印命令参数。下面是假设仅仅只打印employee每条记录的name(字段数字 2).

$ awk '{print $2}' employee.txt
Doe,CEO
Smith,IT
Reddy,Sysadmin
Ram,Developer
Miller,Sales

等等。它不能按预期的那样工作。直到记录结束它只打印了姓。这是因为默认字字段定界符是空格。我们会问awk能精确地做吗;它成功打印了第二个字段考虑到空格作为定界符,当默认空格作为定界符使用”101,John”成为字段1 “Doe,CEO”成为第一条记录的字段2。因此上面awk例子打印了”Doe,CEO”作为第二字段

解释这个问题,我们应该指导awk去使用逗号(,)作为字段定界符。使用选项-F来标示字段分隔。

awk -F ',' '{print $2}' employee.txt
John Doe
Jason Smith
Raj Reddy
Anand Ram
Jane Miller

当只有一个字符被使用为定界符,以下任何公式都可以工作即:你可以指定单引号内的字段分隔符,或者双引号,或者不带任何引号显示如下:

$ awk -F ',' '{print $2}' employee.txt
$ awk -F "," '{print $2}' employee.txt
$ awk -F, '{print $2}' employee.txt

注意:你可以可以使用FS变量达到这个效果。我们将回顾一下awk内置变量部分。

一个简单的报告打印employee name和title使用一个header和footer:

$ awk -F ',' 'BEGIN {print "------------\nName\tTitle\n------------"} {print $2, "\t", $3;} END {print "------------"}' employee.txt
------------
Name    Title
------------
John Doe      CEO
Jason Smith      IT Manager
Raj Reddy      Sysadmin
Anand Ram      Developer
Jane Miller      Sales Manager
------------

上面的报告字段没有适当的对齐,我们将在后面的章节看看如何做到这一点。上面的例子告诉你可以使用BEGIN去打印一个头部信息,并且END去打印一个尾部信息。

请注意字段$0代表整个记录。下面两个例子是一样的;每次打印employee.txt整行。

$ awk '{print}' employee.txt
$ awk '{print $0}' employee.txt