如何在Linux上使用awk命令

在Linux上,awk 是一种命令行文本处理发电机,也是一种功能强大的脚本语言。这是一些最酷功能的介绍。

awk是怎么得到它的名字的

awk 该命令使用1977年写原始版本的三个人的名字缩写来命名:Alfred Aho,Peter Weinberger和Brian Kernighan。这三个人来自传说中的AT&T贝尔实验室Unix万神殿。自那时以来,在许多其他人的贡献下, awk 持续发展。

它是一种完整的脚本语言,以及一个用于命令行的完整文本处理工具包。如果本文引起您的胃口,您可以查看有关以下内容的所有详细信息:awk 及其功能。

规则,模式和动作

awk 在包含由模式和操作组成的规则的程序上工作。该操作在与模式匹配的文本上执行。图案用花括号括起来({})。模式和动作共同构成规则。整个 awk 程序用单引号引起来(').

让我们来看看最简单的 awk 程序。它没有模式,因此它匹配输入到其中的每一行文本。这意味着该动作在每一行上执行。我们将其用于 WHO 命令。

这是来自的标准输出 WHO:

WHO

也许我们不需要所有这些信息,而是只想查看帐户中的名称。我们可以通过管道输出 WHO 进入 awk,然后告诉 awk 仅打印第一个字段。

默认, awk 将字段视为由空格,行首或行尾包围的字符串。字段以美元符号($)和一个数字。所以,$1 代表第一个字段,我们将与 打印 打印第一个字段的操作。

我们输入以下内容:

谁awk'{print $ 1}'

awk 打印第一个字段,并丢弃该行的其余部分。

我们可以根据需要打印任意多个字段。如果我们添加逗号作为分隔符,awk 在每个字段之间打印一个空格。

我们输入以下内容以打印该人登录的时间(第四栏):

谁awk'{print $ 1,$ 4}'

有几个特殊的字段标识符。这些代表整个文本行和文本行中的最后一个字段:

  • $0:代表整个文本行。
  • $1:代表第一个字段。
  • $2:代表第二个字段。
  • $7:代表第七个字段。
  • $45:代表第45个字段。
  • $ NF:代表“字段数”,代表最后一个字段。

我们将键入以下内容,以调出一个小型文本文件,其中包含一个归因于Dennis Ritchie的简短引用:

猫dennis_ritchie.txt

我们想要awk 打印报价的第一个,第二个和最后一个字段。请注意,尽管它在终端窗口中环绕,但只是一行文字。

我们输入以下命令:

awk'{print $ 1,$ 2,$ NF}'dennis_ritchie.txt

我们不知道这种“简单性”。是文本行中的第18个字段,我们不在乎。我们所知道的是这是最后一个领域,我们可以使用 $ NF 获得其价值。句点仅被视为字段正文中的另一个字符。

添加输出字段分隔符

你也可以告诉 awk 在字段之间打印特定的字符,而不是默认的空格字符。来自的默认输出日期 命令有点特殊,因为时间恰好在中间。但是,我们可以键入以下内容并使用 awk 提取我们想要的字段:

日期
日期| awk'{print $ 2,$ 3,$ 6}'

我们将使用 OFS (输出字段分隔符)变量以在月,日和年之间放置分隔符。请注意,下面我们将命令括在单引号('),而不是大括号({}):

日期| awk'OFS =“ /” {print $ 2,$ 3,$ 6}'
日期| awk'OFS =“-” {print $ 2,$ 3,$ 6}'

BEGIN和END规则

一种 开始 规则在任何文本处理开始之前执行一次。实际上,它在执行之前 awk 甚至阅读任何文本。一个 结尾 所有处理完成后执行规则。你可以有多个 开始结尾 规则,它们将按顺序执行。

对于我们的例子 开始 规则,我们将从 dennis_ritchie.txt 我们之前使用的文件,文件名上方。

为此,我们键入以下命令:

awk'BEGIN {print“ Dennis Ritchie”} {print $ 0}'dennis_ritchie.txt

注意 开始 规则在其大括号内包含自己的一组动作({}).

我们可以将相同的技术与之前用于从管道传输输出的命令一起使用 WHO 进入 awk。为此,我们键入以下内容:

谁awk'BEGIN {print“ Active Sessions”} {print $ 1,$ 4}'

输入场分隔符

如果你想 awk 要使用不使用空格分隔字段的文本,您必须告诉它文本将哪个字符用作字段分隔符。例如, / etc / passwd 文件使用冒号(:)分隔字段。

我们将使用该文件以及 -F (分隔符字符串)选项来告诉 awk 使用冒号(:)作为分隔符。我们输入以下内容来告诉 awk 打印用户帐户和主文件夹的名称:

awk -F:'{print $ 1,$ 6}'/ etc / passwd

输出包含用户帐户的名称(或应用程序或守护程序名称)和主文件夹(或应用程序的位置)。

添加图案

如果我们只对普通用户帐户感兴趣,则可以在打印操作中包含一个模式,以过滤掉所有其他条目。由于用户ID号等于或大于1,000,因此我们可以基于该信息进行过滤。

我们仅在第三个字段($3)的值等于或大于1,000:

awk -F:'$ 3> = 1000 {print $ 1,$ 6}'/ etc / passwd

该模式应在与其关联的操作之前紧跟其后。

我们可以使用 开始 为我们的小报告提供标题的规则。我们使用(\ n)符号,用于在标题字符串中插入换行符:

awk -F:'开始{打印“用户帐户\ n -------------”} $ 3> = 1000 {打印$ 1,$ 6}'/ etc / passwd

模式是成熟的正则表达式,它们是 awk.

假设我们要查看已挂载文件系统的通用唯一标识符(UUID)。如果我们搜索 / etc / fstab 出现“ UUID”字符串的文件,则应为我们返回该信息。

我们在命令中使用搜索模式“ / UUID /”:

awk'/ UUID / {print $ 0}'/ etc / fstab

它查找所有出现的“ UUID”并打印这些行。实际上,如果没有 打印 操作,因为默认操作将打印整个文本行。不过,为清楚起见,明确表示通常很有用。浏览脚本或历史记录文件时,您会为自己留下的线索感到高兴。

找到的第一行是注释行,尽管“ UUID”字符串位于其中, awk 仍然找到它。我们可以调整正则表达式并告诉 awk 仅处理以“ UUID”开头的行。为此,我们键入以下内容,其中包括行标记的开头(^):

awk'/ ^ UUID / {print $ 0}'/ etc / fstab

这样更好!现在,我们只看到真正的安装说明。为了进一步优化输出,我们键入以下内容,并将显示限制在第一个字段中:

awk'/ ^ UUID / {print $ 1}'/ etc / fstab

如果我们在这台计算机上安装了多个文件系统,则会得到一个整齐的表,其中包含了它们的UUID。

内建功能

awk 您可以通过命令行和脚本在自己的程序中调用和使用许多功能。如果您进行一些挖掘,将会发现非常有成果。

为了演示调用函数的一般技巧,我们将介绍一些数字函数。例如,以下显示了625的平方根:

awk'BEGIN {print sqrt(625)}'

此命令显示0(零)和-1(正好是数学常数pi)的反正切:

awk'BEGIN {print atan2(0,-1)}'

在以下命令中,我们修改 atan2() 函数在我们打印之前:

awk'BEGIN {print atan2(0,-1)* 100}'

函数可以接受表达式作为参数。例如,这是一种要求25的平方根的复杂方法:

awk'BEGIN {print sqrt((2 + 3)* 5)}'

awk脚本

如果您的命令行变得复杂,或者您开发了要重新使用的例程,则可以转移您的 awk 命令转换成脚本。

在示例脚本中,我们将执行以下所有操作:

  • 告诉外壳程序使用哪个可执行文件来运行脚本。
  • 准备 awk 使用 FS 字段分隔符变量,用于读取带有由冒号分隔的字段的输入文本(:).
  • 使用 OFS 输出字段分隔符告诉 awk 使用冒号(:)以分隔输出中的字段。
  • 将计数器设置为0(零)。
  • 将每行文本的第二个字段设置为空白值(始终为“ x”,因此我们无需查看它)。
  • 打印带有修改后的第二个字段的行。
  • 递增计数器。
  • 打印计数器的值。

我们的脚本如下所示。

开始 规则执行准备步骤,而结尾 规则显示计数器值。中间规则(没有名称,也没有模式,因此它与每一行都匹配)修改第二个字段,打印该行并增加计数器。

脚本的第一行告诉Shell使用哪个可执行文件(awk(在我们的示例中为)以运行脚本。它也通过了 -F (文件名)选项 awk,它会通知它要处理的文本将来自文件。运行文件名时,我们会将其传递给脚本。

我们将以下脚本作为文本包含在内,因此您可以剪切和粘贴:

#!/ usr / bin / awk -f开始{ #打印整行print $ 0#计算另一个帐户的帐户++} END {#打印结果,打印帐户“ \ n”}

将此保存在名为 省略awk。为了使脚本可执行,我们使用以下命令键入以下内容: chmod:

chmod + x omit.awk

现在,我们将运行它并通过 / etc / passwd 文件到脚本。这是文件awk 将使用脚本中的规则为我们处理:

./omit.awk / etc / passwd

处理文件并显示每一行,如下所示。

第二个字段中的“ x”条目已删除,但请注意,字段分隔符仍然存在。对行进行计数,并在输出的底部给出总计。

awk不代表尴尬

awk 不代表尴尬;它代表优雅。它被描述为处理过滤器和报告编写器。更准确地说,是这两者,或者是可以用于这两项任务的工具。在短短的几行中awk 实现了需要使用传统语言进行大量编码的功能。

这种力量是通过简单的规则概念来利用的,这些规则包含模式,选择要处理的文本以及定义处理的动作。


$config[zx-auto] not found$config[zx-overlay] not found