Fedora 提供 awk 作为其默认安装的一部分,包括它的所有版本,包括像 Silverblue 这样的不可变版本。 但您可能会问,什么是 awk,为什么需要它?
awk 是一种数据驱动的编程语言,它在匹配模式时起作用。 在 Fedora,以及大多数其他发行版,使用 GNU awk 或 gawk。 继续阅读以了解更多关于这种语言以及如何使用它的信息。
awk 简史
Awk 于 1977 年在贝尔实验室成立。它的名字是设计师的首字母缩写:Alfred V. Aho、Peter J. Weinberger 和 Brian W. Kernighan。
POSIX 命令语言和实用程序标准中的 awk 规范进一步阐明了该语言。 贝尔实验室的 gawk 设计师和最初的 awk 设计师都为 POSIX 规范提供了反馈。
要更深入地了解 awk/gawk 如何最终变得如此强大和有用,请点击上面的链接。 许多人对当前的 gawk 状态做出了贡献。 其中包括:
- 阿诺德罗宾斯和大卫特鲁曼,gawk 的创造者
- Michael Brennan,mawk 的创建者,后来与 gawk 合并
- Jurgen Kahrs,他在 1997 年为 gawk 添加了网络功能
- John Hague,他重写了 gawk 内部结构并在 2011 年添加了一个 awk 级调试器
使用 awk
以下部分显示了使用 awk 的各种方法 Fedora.
在命令行
调用 awk 的最简单方法是在命令行中。 您可以在文本文件中搜索特定模式,如果找到,则在任何地方打印出与该模式匹配的文件行。 作为一个 example使用 cat 查看你的主目录中的命令历史文件:
$ cat ~/.bash_history
现在可能有很多行正在滚动。
awk 很容易帮助处理这种类型的文件。 您可以使用 awk 来查找特定感兴趣的内容,而不是像 cat 那样将整个文件打印到终端。 为了这 example如果您正在运行标准,请在命令行中键入以下内容 Fedora 版:
$ awk '/dnf/' ~/.bash_history
如果您正在运行 Silverblue,请尝试以下操作:
$ awk '/rpm-ostree/' ~/.bash_history
在这两种情况下,可能会出现比您真正想要的更多的数据。 这对 awk 来说没问题,因为它可以接受正则表达式。 使用上一个 example,您可以更改模式以更紧密地匹配只想了解安装的搜索要求。 尝试将搜索模式更改为以下之一:
$ awk '/rpm-ostree install/' ~/.bash_history
$ awk '/dnf install/' ~/.bash_history
您的所有条目 bash 命令行历史显示在沿线的任何位置具有指定的模式。 awk 一次处理数据文件的一行。 它匹配模式,然后执行一个操作,然后移动到下一行,直到到达文件末尾 (EOF)。
来自 awk 程序
如上所述在命令行中使用 awk 与通过管道输出到 grep 没有太大区别,如下所示:
$ cat .bash_history | grep 'dnf install'
两种方法打印到标准输出 (stdout) 的最终结果是相同的。
awk 是一种编程语言,命令 awk 是该语言的解释器。 awk 的真正力量和灵活性在于您可以使用它制作程序,并将它们与 shell 脚本结合起来以创建更强大的程序。 要使用 awk 进行更多功能丰富的开发,您还可以使用以下方法合并 C 或 C++ 代码 动态扩展.
接下来,为了展示 awk 的强大功能,让我们编写几个程序文件来打印标题并为宾果卡的第一行绘制五个数字。 为此,我们将创建两个 awk 程序文件。
第一个文件打印出宾果卡的标题。 为了这 example 它被称为 bingo-title.awk。 使用您喜欢的编辑器将此文本保存为该文件名:
BEGIN {
print "BtItNtGtO"
}
现在标题程序已准备就绪。 您可以使用以下命令进行尝试:
$ awk -f bingo-title.awk
程序打印单词 BINGO,字符之间有一个制表符空格 (t)。 对于数字选择,让我们使用一个名为 rand() 的 awk 内置数字函数,并使用两个控制语句 for 和 switch。 (除了编辑器改变了我的程序,所以这次没有使用 switch 语句)。
第二个 awk 程序的标题是 bingo-num.awk。 Enter 将以下内容放入您喜欢的编辑器并使用该文件名保存:
@include "bingo-title.awk"
BEGIN {
for (i = 1; i < = 5; i++) {
b = int(rand() * 15) + (15*(i-1))
printf "%st", b
}
}
文件中的@include 语句告诉解释器首先处理包含的文件。 在这种情况下,解释器处理 bingo-title.awk 文件,因此标题首先打印出来。
运行测试程序
现在输入命令来选择一行宾果号码:
$ awk -f bingo-num.awk
输出类似于以下内容。 请注意,awk 中的 rand() 函数对于真正的随机数并不理想。 只在这里使用 example 目的。
$ awk -f bingo-num.awk
B I N G O
13 23 34 53 71
在里面 example,我们创建了两个只有开始部分的程序,它们使用动作来操作从 awk 程序中生成的数据。 为了满足宾果游戏的规则,需要做更多的工作才能达到理想的结果。 鼓励读者修复程序,以便他们可以可靠地选择宾果游戏号码,也许可以查看 awk 函数 srand() 以获得有关如何完成的答案。
最后的例子
即使对于您遇到的平凡的日常搜索任务,Awk 也很有用,例如列出来自 org.gnome 的 Flathub 存储库中的所有 flatpak(假设您有 Flathub 存储库设置)。 执行此操作的命令是:
$ flatpak remote-ls flathub --system | awk /org.gnome/
将出现一个列表,其中显示了 remote-ls 与 org.gnome 模式匹配的所有输出。 要查看已经从 org.gnome 安装的 flatpaks,请输入以下命令:
$ flatpak list --system | awk /org.gnome/
awk 是一种功能强大且灵活的编程语言,它非常好地填补了文本文件操作的利基市场。