云网牛站
所在位置:首页 > Linux编程 > 在Fedora系统下使用Awk的方法

在Fedora系统下使用Awk的方法

2019-04-30 15:26:11作者:赖以葵稿源:云网牛站

Fedora系统提供awk作为其默认安装的一部分,包括其所有版本,包括像Silverblue这样的不可变版本。但你可能会问,什么是awk,你为什么需要它?

在Fedora系统下使用Awk的方法

 

简介

Awk是一种数据驱动的编程语言,在与模式匹配时起作用,在Fedora和大多数其他Linux发行版上,使用GNU awk或gawk。参考awk命令_Linux awk命令使用详解:文本与数据进行处理的编程语言

附:awk的简史

Awk于1977年在贝尔实验室开始。它的名字来自设计师的首字母缩写:Alfred V. Aho,Peter J. Weinberger和Brian W. Kernighan。

POSIX命令语言和实用程序标准中的awk规范进一步阐明了该语言,贝尔实验室的gawk设计师和原始awk设计师都为POSIX规范提供了反馈。许多人为当前的gawk做出了贡献,其中包括:

阿诺德罗宾斯和大卫真曼,gawk的创造者。

迈克尔布伦南,马克的创造者,后来与gawk合并。

Jurgen Kahrs,他在1997年增加了网络能力。

John Hague在2011年改写了gawk内部并添加了一个awk级调试器。

 

使用awk

以下是在Fedora中使用awk的各种方法。

1、在命令行

调用awk的简单方法是在命令行,您可以在文本文件中搜索特定模式,如果找到,则在任何位置打印出与模式匹配的文件行,例如,使用cat查看主管中的命令历史文件:

$ cat ~/.bash_history

现在可能有很多行在滚动。

Awk很容易帮助这类文件,您可以使用awk查找特别感兴趣的内容,而不是像cat一样将整个文件打印到终端,对于此示例,如果您运行的是标准Fedora版本,请在命令行键入以下内容:

$ awk '/dnf/' ~/.bash_history

如果您正在运行Silverblue(在Silverblue上测试Fedora 30 Beta),请尝试以下方法:

$ awk '/rpm-ostree/' ~/.bash_history

在这两种情况下,可能会出现比您真正想要的更多数据,这对于awk来说没问题,因为它可以接受正则表达式,使用前面的示例,您可以更改模式以更紧密地匹配想要仅了解安装的搜索要求,尝试将搜索模式更改为以下之一:

$ awk '/rpm-ostree install/' ~/.bash_history

$ awk '/dnf isntall/' ~/.bash_history

您的bash命令行历史记录的所有条目都显示为在该行的任何位置指定了模式,Awk一次只能处理一行数据文件,它匹配模式,然后执行操作,然后移动到下一行,直到到达文件结尾(EOF)。

2、来自awk程序

在上面的命令行中使用awk与管道输出到grep没有太大的不同,如下所示:

$ cat .bash_history | grep 'dnf install'

打印到标准输出(stdout)的最终结果与两种方法相同。

awk是一种编程语言,命令awk是该语言的解释器,awk的真正功能和灵活性是你可以用它来制作程序,并将它们与shell脚本结合起来,以创建更强大的程序,对于使用awk进行更多功能丰富的开发,您还可以使用Dynamic-Extensions合并C或C++代码。

接下来,为了显示awk的强大功能,让我们制作几个程序文件来打印标题并为宾果卡的第一行绘制五个数字,为此,我们将创建两个awk程序文件。

第一个文件打印出宾果卡的标题,对于这个例子,它被称为bingo-title.awk,使用编辑器将此文本保存为该文件名:

BEGIN { 

print "B\tI\tN\tG\tO"

}

现在标题程序准备好了,您可以使用此命令尝试:

$ awk -f bingo-title.awk

程序打印单词BINGO,字符之间有一个制表符空格(\t),对于数字选择,让我们使用一个名为rand()的awk内置数值函数,并使用两个控制语句for和switch(除了编辑器改变了我的程序,所以这次没有使用switch语句)。

第二个awk程序的标题是bingo-num.awk,在编辑器中输入以下内容并使用该文件名保存:

@include "bingo-title.awk"

BEGIN {

for (i = 1; i < = 5; i++) {

b = int(rand() * 15) + (15*(i-1))

printf "%s\t", b

}

print

}

文件中的@include语句告诉解释器首先处理包含的文件,在这种情况下,解释器处理bingo-title.awk文件,因此标题首先打印出来。

3、运行测试程序

现在输入命令以选择一行bingo号码:

$ awk -f bingo-num.awk

输出显示类似于以下内容,请注意,awk中的rand()函数对于真正的随机数并不理想,它仅用于示例目的:

$ awk -f bingo-num.awk 

BINGO

13 23 34 53 71

在这个例子中,我们创建了两个只有开始部分的程序,这些部分使用动作来操作awk程序中生成的数据,为了满足宾果游戏规则,需要做更多的工作才能达到理想的效果,鼓励读者修复程序,以便他们可以可靠地选择宾果数字,或者查看awk函数srand()以获得有关如何完成的答案。

4、Final examples

即使对于您遇到的平凡日常搜索任务,Awk也很有用,比如在org.gnome中列出Flathub存储库中的所有flatpak(假设您已经安装了Flathub存储库,参考在Fedora Linux系统中安装Flathub应用程序),执行此操作的命令将是:

$ flatpak remote-ls flathub --system | awk /org.gnome/

将出现一个列表,显示与org.gnome模式匹配的remote-ls的所有输出,要查看已从org.gnome安装的flatpaks,请输入以下命令:

$ flatpak list --system | awk /org.gnome/

可以这么说,Awk是一种功能强大且灵活的编程语言,可以很好地填补文本文件操作的空白。

 

相关主题

SUSE开发者希望在GCC编译器中采用Python来替代AWK

精选文章
热门文章