Linux基础知识 ·

Linux文本三剑客之awk基本语法

[隐藏]

AWK基本语法

AWK 使用起来非常方便。我们可以直接通过命令行的方式为 AWK 程序提供 AWK 命令,也可以使用包括 AWK 命令的脚本文件。

AWK 命令行

如下所示,在命令行中,我们可以使用如下的格式调用 AWK 命令,其中 AWK 命令由单引号括起来:

awk [options] file ...

范例:

假设我们有一个名为 marks.txt 的文件需要处理,文件中的内容如下:

我们可以按如下方式使用 AWK 命令输出整个文件中的内容:

AWK 程序文件

接下来讲解的是另外一种提供 AWK 命令的方式——通过脚本文件提供:

awk [option] -f file ....

首先,创建一个文本文件 command.awk,在文件中输入如下 AWK 命令:

现在,我们可以调用 AWK 从文本文件中读入命令并执行。这里,我们实现了与上面例子相同的效果:

AWK 标准选项

我们使用 --help 选项查看一下 awk 支持的选项。

在命令行环境下,AWK 常用如下的标准选项:

-v 选项

这个选项可以为变量赋值。它允许在程序执行之前为变量赋值。下面是一个 -v 选项使用的示例程序:

--dump-variables[=file] 选项

此选项会将全局变量及相应值按序输出到指定文件中。默认的输出文件名是 awkvars.out。

--lint[=fatal] 选项

这个选项用于检查程序的可移植情况以及代码中的可疑部分。如果提供了参数 fatal,AWK 会将所有的警告信息当作错误信息处理。下面这个简单的示例说明了 lint 选项的用法:

--posix 选项

这个选项会打开严格 POSIX 兼容性审查。 如此,所有共同的以及 GAWK 特定的扩展将被设置为无效。

--profile[=file] 选项

这个选项会将程序文件以一种很优美的方式输出(译注:用于格式化 awk 脚本文件)。默认输出文件是 awkprof.out。示例如下:

-F 选项

这个选项可以指定输入分隔符,分隔符可以是字符串或正则表达式。

基本示例

本章节中,我们将用几个示例来讲解几个有用的 AWK 命令。 假设我们经有一个文件文件 marks.txt 等待处理,它所包含的内容如下:

答应列或域

我们可以使用 AWK 命令仅输出输入文件中某些特定的列的内容。示例如下:

执行上面的命令可以得到如下结果:

在 marks.txt 文件中,第三列包含课程名字,第四列包含在该课程的得分。我们使用 AWK 输出命令只输出了这两列的内容。上面例子中,$3与$4代表输入记录中的第三列与第四列的内容。

输出所有行

默认情况下,如果某行与模式串匹配,AWK 会将整行输出:

执行上面的命令可以得到如下结果:

上面的示例中,我们搜索模式串 a,每次成功匹配后都会执行主体块中的命令。如果没有主体块——默认的动作是输出记录(行)。因此上面的效果也可以使用下面简略方式实现,它们会得到相同的结果:

通过匹配模式串输出列

前面我们已经看到了,当模式串匹配成功后, AWK 默认会输出整个记录。不过,我们可以让 AWK 只输出特定的域(列)的内容。 例如,下面的这个例子中当模式串匹配成功后只会输出第三列与第四列的内容:

执行上面的命令可以得到如下结果:

以任意顺序输出列

我们能以任意顺序输出各列吗?当然可以! 下面的例子中我们将在第四列后输出第三列的内容:

执行上面的命令可以得到如下结果:

计数匹配次数并输出

让我们尝试一个更有意思的例子,在这个例子中我们会统计模式串成功匹配的次数,并将该结果打印出来:

执行上面的命令可以得到如下结果:

上面这个例子中,每次成功的匹配我们都会增加计数器的值,并在结束块中将该计数器的值输出。 请注意,与其它编程语言不一样的地方在于, AWK 在使用一个变量前不需要特意地声明这个变量。

输出字符数多于 18 的行

这个例子中我们只输出那些字符数超过 18 的记录:

执行上面的命令可以得到如下结果:

AWK 提供了内置的 length 函数。该函数返回字符串的长度。变量 $0 表示整行,缺失的主体块会执行默认动作,例如,打印输出。 因此,如果一行中字符数超过 18, 则比较的结果为真,该行则被输出。

参与评论