AWK基本示例 - Awk教程

本教程将介绍一些有用的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文件中第3列包含科目名和第四列包含特定科目标记。这里使用AWK的printf命令打印这两列。在上面的例子中$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

按任何顺序打印列

可以以任何顺序打印列?是的!当然,我们可以做到这一点。比如下面的例子打印第4列后是第3列。

[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

在上面的例子中,我们增加计数器的值在模式匹配成功时,打印END块这个值。请注意,不像其他的编程语言,这里不需要声明变量就可以直接使用它。

打印超过18个字符的行

仅打印那些含有多于18个字符的行。

[jerry]$ awk 'length($0) > 18' marks.txt

在执行上面的代码后,得到以下结果:

3)    Shyam    Biology    87
4)    Kedar    English    85

AWK提供了内置的长度函数返回字符串的长度。$0 变量存储整行,并在没有主体块默认采取动作即打印操作。因此,如果一行超过18个字符,比较结果为true那么这一行将被打印出来。