如何在 Linux 上使用 AWK
Linux 提供的实用程序通常遵循 UNIX 的设计理念。任何工具都应该很小,使用纯文本进行 I/O,并以模块化方式操作。得益于这些遗产,我们在 sed 和 awk 等工具的帮助下拥有了一些最好的文本处理功能。
在 Linux 中,所有 Linux 发行版上都预安装了 awk 工具。 AWK 本身是一种编程语言。 AWK工具只是AWK编程语言的解释器。在本指南中,了解如何在 Linux 上使用 AWK。
AWK的使用
当文本以可预测的格式组织时,AWK 工具最有用。它非常擅长解析和操作表格数据。它在整个文本文件上逐行运行。
awk 的默认行为是使用空格(空格、制表符等)来分隔字段。值得庆幸的是,Linux 上的许多配置文件都遵循这种模式。
基本语法
这就是 awk 的命令结构。
该命令的各个部分是非常不言自明的。 awk 可以在没有搜索或操作部分的情况下运行。如果未指定任何内容,则匹配的默认操作将只是打印。基本上,awk 将打印文件中找到的所有匹配项。
如果没有指定搜索模式,那么 awk 将对文件的每一行执行指定的操作。
如果给出了两个部分,那么 awk 将使用该模式来确定当前行是否反映它。如果匹配,则 awk 执行指定的操作。
请注意,awk 还可以处理重定向的文本。这可以通过将命令的内容通过管道传递给 awk 来执行。了解有关 Linux 管道命令的更多信息。
出于演示目的,这里有一个示例文本文件。它包含 10 行,每行 2 个单词。
正则表达式
使 awk 成为强大工具的关键功能之一是支持正则表达式(简称 regex)。正则表达式是表示某种字符模式的字符串。
以下是一些最常见的正则表达式语法的列表。这些正则表达式语法不仅仅是 awk 所独有的。这些几乎是通用的正则表达式语法,因此掌握它们也将有助于涉及正则表达式的其他应用程序/编程。
基本字符:所有字母数字字符、下划线(_)等。
元字符:这些字符解释了扩展普通字符的各种方式。
星号 (*):其前面的直接字符存在零个或多个是有效的。
括号([]):如果在该位置,括号中的任何字符匹配,则匹配有效。它可以与字符集结合使用。
插入符 (^):匹配项必须位于行的开头。
美元 ($):匹配必须位于该行的末尾。
反斜杠(\):如果任何元字符必须按字面意义使用。
打印文本
要打印文本文件的所有内容,请使用 print 命令。对于搜索模式,没有定义模式。因此,awk 打印所有行。
这里,“print”是一个 AWK 命令,用于打印输入的内容。
字符串搜索
AWK 可以对给定文本执行基本文本搜索。在模式部分,它必须是要查找的文本。
在以下命令中,awk 将在文件sample.txt 的所有行中搜索文本“quick”。
现在,让我们使用一些正则表达式来进一步微调搜索。以下命令将打印所有以“brown”开头的行。
在行尾找到一些东西怎么样?以下命令将打印所有末尾带有“quick”的行。
通配符图案
下一个示例将展示插入符号 (.) 的用法。这里,字符“e”之前可以有任意两个字符。
通配符模式(使用星号)
如果该位置可以有任意数量的字符怎么办?要匹配该位置上任何可能的字符,请使用星号 (*)。在这里,AWK 将匹配“the”之后具有任意数量字符的所有行。
括号表达式
下面的例子将展示如何使用括号表达式。括号表达式表明在该位置,如果匹配括号内的字符集,则匹配有效。例如,以下命令将“The”和“Tee”匹配为有效匹配项。
正则表达式中有一些预定义的字符集。例如,所有大写字母的集合被标记为“A-Z”。在以下命令中,awk 将匹配所有包含大写字母的单词。
看看下面带有括号表达式的字符集的用法。
[0-9]:表示单个数字
[a-z]:表示单个小写字母
[A-Z]:表示单个大写字母
[a-zA-z]:表示单个字母
[a-zA-z 0-9]:表示单个字符或数字。
awk 预定义变量
AWK 附带了一堆预定义的自动变量。这些变量可以使使用 AWK 编写程序和脚本变得更加容易。
以下是您会遇到的一些最常见的 AWK 变量。
FILENAME:当前输入文件的文件名。
RS:记录分隔符。由于 AWK 的性质,它一次处理一条记录的数据。这里,该变量指定用于将数据流分割成记录的分隔符。默认情况下,该值是换行符。
NR:当前输入的记录数。如果RS值设置为默认值,则该值将指示当前输入行号。
FS/OFS:用作字段分隔符的字符。读取后,AWK 将记录拆分为不同的字段。分隔符由 FS 的值定义。打印时,AWK 重新连接所有字段。不过,此时,AWK 使用 OFS 分隔符而不是 FS 分隔符。一般来说,FS和OFS是相同的,但不强制如此。
NF:当前记录中的字段数。如果使用默认值“whitespace”,那么它将匹配当前记录中的单词数。
ORS:输出数据的记录分隔符。默认值是换行符。
让我们来看看它们的实际效果。以下命令将使用 NR 变量打印 example.txt 中的第 2 行到第 4 行。 AWK 还支持逻辑运算符,例如逻辑与 (&&)。
要将特定值分配给 AWK 变量,请使用以下结构。
例如,要从输入文件中删除所有空行,请将 RS 的值更改为基本无。这是一个使用晦涩难懂的 POSIX 规则的技巧。它指定如果 RS 的值为空字符串,则记录由由换行符和一个或多个空行组成的序列分隔。在 POSIX 中,没有内容的空行是完全空的。但是,如果该行包含空格,则它不被视为“空白”。
其他资源
AWK 是一个功能强大的工具,具有大量功能。虽然本指南涵盖了其中的很多内容,但它仍然只是基础知识。掌握 AWK 需要的不仅仅是这些。本指南应该是对该工具的很好的介绍。
如果您确实想掌握该工具,那么您应该查看以下一些其他资源。
修剪空白
使用条件语句
打印一系列列
正则表达式与 AWK
20 个 AWK 示例
互联网是一个学习东西的好地方。对于非常高级的用户来说,有很多关于 AWK 基础知识的精彩教程。
最后的想法
希望本指南有助于更好地理解 AWK 基础知识。虽然可能需要一段时间,但就其所赋予的功能而言,掌握 AWK 是非常有益的。
快乐计算!