如何在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
实现了需要使用传统语言进行大量编码的功能。
这种力量是通过简单的规则概念来利用的,这些规则包含模式,选择要处理的文本以及定义处理的动作。