116

我不断学习新工具,甚至是老式工具,因为我喜欢使用正确的解决方案来解决问题。

尽管如此,我想知道是否还有任何理由学习其中的一些。awk例如对我来说很有趣,但是对于简单的文本处理,我可以使用grep, cut,sed等,而对于复杂的,我会使用 Python。

现在我并不是说它不是一个强大而方便的工具。但是既然学习一个新工具需要时间和精力,值得吗?

4

24 回答 24

113

如果你快速学习了 awk 的基础知识,你确实可以在命令行上做出惊人的事情。

但学习 awk 的真正原因是有理由阅读其作者 Aho、Kernighan 和 Weinberger 撰写的精彩书籍The AWK Programming Language 。你会认为,从名字上看,它只是教你 awk。其实,这只是开始。一旦使用简洁的脚本语言,可以轻松解决字符串操作的大量问题(而 awk 是第一个),它会继续教读者如何实现数据库、解析器、解释器,以及(如果我没记错的话)一个小型项目特定计算机语言的编译器!如果他们还使用 awk 编写了一个示例操作系统,那么这本书将是一本相当完整的计算机科学概论!

以简洁明了着称,就像最初的 C 语言书籍一样,它也是正确完成友好技术写作的一个很好的例子。就连索引也是一件手艺。

啊?如果你知道它,你会偶尔在命令行中使用它,但对于任何更大的东西,你会感到被困住,无法访问你的系统和互联网的更广泛的功能,而 Python 提供了访问。但是书呢?你会一直很高兴你读到它!

于 2009-03-31T21:38:15.710 回答
102

我认为这取决于您所处的环境。如果您是 *nix 人,那么知道awk是一件好事。几乎每个 *nix 上都可以找到的唯一其他脚本环境是sh. 因此,虽然grep, sed,etc 肯定可以取代awk现代主流linux发行版,但当您转向更奇特的系统时,了解一点awk将是真正的方便。

awk也可以用于不仅仅是文本处理。例如,我的一位主管在其中编写天文学代码awk- 这就是他的老派令人敬畏的程度。回到他的时代,它是完成这项工作的最佳工具......现在,即使他的学生像我这样使用 python 之类的,他仍然坚持他所知道的并且工作得很好。

最后,世界上有很多旧代码在踢,知道一点awk不会有坏处。它也会让你变得更好 *nix 人 :-)

于 2008-09-20T08:31:51.387 回答
30

我使用的唯一原因awk是自动拆分:

awk '{print $3}' < file.in

这将打印file.in. 这比:

tr -s ' ' < file.in | cut -d' ' -f3
于 2008-09-20T08:28:14.173 回答
25

如果您的文件包含columns/fields ,我认为 awk 很棒。我在处理/分析多列文件中的特定列时使用它。或者,如果我想添加/删除特定列。

例如

awk -F \t '{ if ($2 > $3) print; }' <filename>

仅当制表符分隔文件中的第 2 列值大于第 3 列值时才会打印。

当然,我可以使用 Perl 或 Python,但是 awk 使用简洁的单行命令使它变得如此简单。

学习 awk 的成本也很低。您可以在不到一个小时的时间内学习 awk 基础知识,因此它不像学习任何其他编程/脚本语言那样费力。

于 2008-09-20T08:44:03.917 回答
9

我偶尔使用 AWK 来处理 HTML。例如,此代码将表转换为 csv 文件:

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

如果您要进行屏幕抓取,那就太好了。实际上,我可能喜欢 AWK,因为它允许我如此快速地构建错误的问题解决方案 :)更多示例Jon Bentley 可爱的Programming Pearls中也提到了这一点。

于 2008-11-08T22:03:12.797 回答
9

问了这个问题 6 年后,我现在可以肯定地回答:不,学习 awk 不值得。

基本任务由基本的 bash 命令甚至 GUI 工具轻松处理。使用 Python(我的最爱)或 Ruby 等现代动态语言可以轻松处理更复杂的任务。

您绝对应该学习一门现代脚本动态语言,因为它将帮助您完成许多任务(网络、管理、数据处理、自动化等)。而且这样做,学习一个像awk这样的工具是完全没用的,它每个月最多可以为你节省几秒钟。

于 2016-12-20T08:03:08.423 回答
7

我确实经常使用 awk。它适用于在管道中间进行非常简单的文本改组;它填补了根本不需要它和需要淘汰 Perl/Python/其他东西之间的一个非常狭窄的位置。

我不建议您在上面花费大量时间,但了解语法的基础知识可能会派上用场——至少足以让您在想要使用它时快速查阅手册。

于 2008-09-20T08:26:41.257 回答
7

在我的上一份合同中,学习 AWK 对我来说是非常宝贵的,因为我在一个既没有安装 Perl 也没有安装大多数其他脚本语言的嵌入式 Linux 系统上工作。

于 2008-11-14T10:33:14.523 回答
5

如果您已经了解并使用过 sed,那么您不妨至少学习一点 awk。可以将它们组合在一起以获得一些非常强大的技巧。总是给观众留下深刻印象。

于 2008-09-20T08:32:24.020 回答
5

大多数 awk one liners 可以使用 Perl one liners 来实现——如果你选择进入 Perl one liner 的心态。或者,只需使用 Perl 三个衬里 :)

如果您正在维护由喜欢 awk 的人编写的 shell 脚本,那么显然,您将需要学习 awk。

即使没有实际需要,如果您已经了解 regex,也不会花很长时间学习基础知识,而且看看当时的东西是如何设计的很有趣。它相当优雅。

于 2008-09-20T09:09:27.833 回答
4

Computerworld 最近就AWK采访了 Alfred V. Aho(AWK 的三位创建者之一)。这是一本非常有趣的读物。所以也许你会在其中找到一些提示,为什么学习 AWK 是个好主意。

于 2008-09-26T11:14:31.773 回答
3

awk 具有非常好的比率实用程序/难度,并且“简单 awk”适用于每个 Unix/Linux/MacOS(它也可以安装在其他系统中)。

它是在人们讨厌打字的黄金时代设计的,因此脚本可以非常非常短且快速编写。我将尝试安装 mawk,一个快速版本,据称它可以将计算加速大约 9 倍,awk/gawk 相当慢,所以如果你想使用它而不是 R 等,你可能需要 mawk。

于 2016-12-16T16:02:11.037 回答
2

如果您在编写 shell 脚本时必须偶尔解析日志文件以获取数据或程序的输出,这将非常有用,因为在 awk 中很容易实现,这将需要您在 python 中多写几行代码。

它当然比这更强大,但这似乎是大多数人使用它的任务。

于 2008-09-20T08:32:58.187 回答
2

当然:我正在一个环境中工作,其中唯一可用的语言是:(一些生成 COBOL、OMG、OMG 的糟糕语言)、bash(旧版本)、perl(我还没有掌握)、sed、awk ,以及其他一些命令行实用程序。知道awk为我节省了几个小时(并且从我的同事那里产生了几个文本处理任务——他们每天至少来我这里三次)。

于 2008-09-26T10:40:53.040 回答
1

我会说这可能不值得了。我不时将它用作比 sed 更通用的流编辑器,包括搜索功能,但是如果您精通 python,我不知道您可以更快地完成一项任务以弥补所需的时间学习awk。

以下命令可能是我在过去两年中使用 awk 的唯一命令(它从我的 Debian/Ubuntu 系统中清除了一半删除的软件包):

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P
于 2008-09-20T08:28:16.700 回答
1

没有。

尽管它可能很有趣,但您可以使用其他更强大的工具(例如 Perl)完成 awk 可以做的所有事情。

花时间学习那些更强大的工具 - 并且只是在此过程中偶然捡到一些 awk。

于 2008-09-20T08:31:50.293 回答
1

我会说有。对于简单的东西,对于没有经验的系统管理员/开发人员来说,AWK 比 Python 容易得多。你可以学习一点 AWK 并做很多事情,学习 Python 意味着学习一门全新的语言(是的,我知道 AWK 是一种语言也是一种感觉)。

Perl 可能可以做很多 AWK 可以做的事情,但是在这个时代提供了选择,我会在这里选择 Python。所以是的,你应该学习 AWK。但也要学习 Python :-)

于 2008-11-12T16:49:14.787 回答
1

我最近试图可视化记录超过 20Gbs 的 DOS 攻击的网络 pcap 文件。我需要时间戳和 IP 地址。在我的场景中,AWK one-liner 的运行速度也非常快。我专门使用AWK清理提取的文件,在分组的时间范围内从这些 IP 地址获取 IP 地址和数据包总数。我完全同意上面其他人写的。这取决于您的需求。

于 2014-08-20T21:13:58.297 回答
1

awkawk是一种 powertool 语言,因此如果您是任何类型的 IT 专业人员,您很可能会在某个地方找到使用它。如果您可以处理的语法和正则表达式,grep那么sed您应该没有问题,awk并且可能值得。

我发现awk真正闪耀的地方在于简化处理多行记录和同时修改/内插多个文件之类的事情。

于 2015-08-03T23:31:57.930 回答
1

不学习 awk 的一个原因是它在正则表达式中没有非贪婪匹配。

我有一个 awk 代码,现在我必须重写它只是因为我突然调试到 awk/gawk 中没有非贪婪匹配之类的东西,因此它无法正确执行一些正则表达式。

于 2017-07-17T06:45:46.513 回答
1

这取决于你的队友和你的领导者以及你正在从事的任务。

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}
于 2018-04-14T04:52:11.677 回答
0

既然 PERL 已被移植到几乎所有重要的平台上,我会说这不值得。它比 sed 和 awk 更通用。至于自动拆分,您可以在 perl 中这样做:

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

编辑:您可能仍想对awk有所了解,因为其他一些工具基于其基于模式的操作理念(例如 Solaris 上的 DTrace)。

于 2008-09-26T11:24:57.097 回答
0

我在区域工作,文件是列格式。所以 awk 对我来说是非常宝贵的,可以重新格式化文件,以便不同的软件可以一起工作。对于非 IT 职业来说,使用 awk 就足够了,而且很完美。现在一天,计算机速度不再是问题,所以我可以结合 awk 和 unix 将许多 1 行命令传递到“脚本”中。使用 awk 按字段和记录搜索,我用它来非常快速地检查文件数据,而不是“vi”来打开文件。不得不说,awk 能力特别给我的工作带来了乐趣,我能够帮助同事使用 awk 快速解决问题。对我来说很棒的代码。

于 2014-04-26T02:59:15.267 回答
0

目前我一直在用python进行一些编码。但我仍然不太了解它以轻松用于简单的一次性文件转换。

使用 awk,我可以在 unix 命令行上快速开发一行代码,可以进行一些漂亮的转换。每次我使用 awk 时,我写的这段代码都是一次性的,不会超过几行。也许在一行的此处或此处有“if”语句和“printf”语句。

我从来没有用 awk 写过超过 10 行的代码。几年前我看过一些这样的脚本。

但是任何需要多行代码的东西,我都会求助于 python。

我爱awk。它与 sed 结合使用是一个非常强大的工具。

于 2019-01-03T08:30:14.987 回答