本章节中,我们将用几个示例来讲解几个有用的 AWK 命令。 假设我们经有一个文件文件 marks.txt 等待处理,它所包含的内容如下:
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
我们可以使用 AWK 命令仅输出输入文件中某些特定的列的内容。示例如下:
[jerry]$ awk '{print $3 "\t" $4}' marks.txt
执行上面的命令可以得到如下结果:
Physics 80
Maths 90
Biology 87
English 85
History 89
在 marks.txt 文件中,第三列包含课程名字,第四列包含在该课程的得分。我们使用 AWK 输出命令只输出了这两列的内容。上面例子中,$3与$4代表输入记录中的第三列与第四列的内容。
默认情况下,如果某行与模式串匹配,AWK 会将整行输出:
[jerry]$ awk '/a/ {print $0}' marks.txt
执行上面的命令可以得到如下结果:
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
上面的示例中,我们搜索模式串 a,每次成功匹配后都会执行主体块中的命令。如果没有主体块——默认的动作是输出记录(行)。因此上面的效果也可以使用下面简略方式实现,它们会得到相同的结果:
[jerry]$ awk '/a/' marks.txt
前面我们已经看到了,当模式串匹配成功后, AWK 默认会输出整个记录。不过,我们可以让 AWK 只输出特定的域(列)的内容。 例如,下面的这个例子中当模式串匹配成功后只会输出第三列与第四列的内容:
[jerry]$ awk '/a/ {print $3 "\t" $4}' marks.txt
执行上面的命令可以得到如下结果:
Maths 90
Biology 87
English 85
History 89
我们能以任意顺序输出各列吗?当然可以! 下面的例子中我们将在第四列后输出第三列的内容:
[jerry]$ awk '/a/ {print $4 "\t" $3}' marks.txt
执行上面的命令可以得到如下结果:
90 Maths
87 Biology
85 English
89 History
让我们尝试一个更有意思的例子,在这个例子中我们会统计模式串成功匹配的次数,并将该结果打印出来:
[jerry]$ awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt
执行上面的命令可以得到如下结果:
Count = 4
上面这个例子中,每次成功的匹配我们都会增加计数器的值,并在结束块中将该计数器的值输出。 请注意,与其它编程语言不一样的地方在于, AWK 在使用一个变量前不需要特意地声明这个变量。
这个例子中我们只输出那些字符数超过 18 的记录:
[jerry]$ awk 'length($0) > 18' marks.txt
执行上面的命令可以得到如下结果:
3) Shyam Biology 87
4) Kedar English 85
AWK 提供了内置的 length 函数。该函数返回字符串的长度。变量 $0 表示整行,缺失的主体块会执行默认动作,例如,打印输出。 因此,如果一行中字符数超过 18, 则比较的结果为真,该行则被输出。