Is there still any reason to learn AWK?

I am constantly learning new tools, even old fashioned ones, because I like to use the right solution for the problem.

Nevertheless, I wonder if there is still any reason to learn some of them. awk for example is interesting to me, but for simple text processing, I can use grep, cut, sed, etc. while for complex ones, I'll go for Python.

Now I don't mean that's it's not a powerful and handy tool. But since it takes time and energy to learn a new tool, is it worth it ?

34197 次浏览

我经常用 awk。它适用于在管道中进行非常简单的文本洗牌; 它填补了一个非常狭窄的空白,介于根本不需要它和需要使用 Perl/Python/whatever 之间。

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

The only reason I use awk is the auto-splitting:

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

这将打印出 file.in中第三个以空格分隔的字段:

tr -s ' ' < file.in | cut -d' ' -f3

我觉得可能已经不值得了。我经常使用它作为一个比 sed 更多才多艺的流编辑器,包括搜索功能,但是如果你精通 python,我不知道有什么任务可以让你更快地完成,以弥补学习 awk 所需的时间。

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

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P

没有。

尽管这可能很有趣,但是您可以使用其他更强大的工具(如 Perl)来完成 awk 可以完成的所有工作。

把时间花在学习那些更强大的工具上——并且只是偶尔在学习过程中学到一些东西。

我认为这取决于你所处的环境。如果你是一个 * nix 人,那么知道 awk是一件好事。几乎在每个 * nix 上都可以找到的唯一其他脚本环境是 sh。因此,虽然 grepsed,等肯定可以取代 awk在一个现代的主流 linux发行版,当你移动到更多的外来系统,知道一点 awk将是真正的便利。

awk还可以用于不仅仅是文本处理。例如,我的一个主管用 awk写天文学代码——这就是他完全用 老派太棒了写的代码。在他的时代,这是最好的工具... 现在,即使他的学生,像我一样使用蟒蛇什么的,他坚持什么,他知道,并工作得很好。

In closing, there is a lot of old code kicking around the world, knowing a little awk isn't going to hurt. It will also make you better *nix person :-)

如果您已经知道并使用 sed,那么至少可以学习一点 awk。它们可以通过管道连接起来,制造一些非常强大的魔术。总能给观众留下深刻印象。

如果您不得不在 shell 脚本编程时偶尔解析日志文件以获取数据或程序的输出,那么这种方法非常有用,因为在 awk 中很容易实现这一点,而在 python 中则需要多花费几行代码。

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

我认为 awk 是伟大的,如果你的文件包含 栏/栏。我在处理/分析多列文件中的特定列时使用它。或者如果我想添加/删除某个特定的列。

例如:。

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

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

Of course I could use Perl or Python, but awk makes it so much simpler with a concise single line command.

此外,学习 awk 的成本相当低。你可以在不到一个小时的时间里学习 awk 的基础知识,所以这比学习任何其他编程/脚本语言都要省力。

大多数 awk 一行程序可以用 Perl 一行程序实现-如果您选择进入 Perl 一行程序的思维模式。或者,只使用 Perl 三行程序:)

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

即使没有实际需要,如果您已经知道正则表达式,也不会花很长时间来学习基础知识,看看当时是如何设计的也很有趣。相当优雅。

当然: 我所工作的环境中,唯一可用的语言是: (一些生成 COBOL、 OMG、 OMG 的烂语言)、 bash (旧版本)、 perl (我还没有掌握它)、 sed、 awk 和其他一些命令行实用程序。了解 awk为我节省了几个小时的时间(而且我的同事们还为我生成了几个文本处理任务——他们每天至少来找我三次)。

《计算机世界》最近和阿尔弗雷德 · V · 阿霍(AWK 的三位创始人之一)一起做了一个关于 AWK 的 面试。这本书很有意思。因此,也许你会发现一些提示,为什么它是一个好主意学习 AWK。

Now that PERL is ported to pretty much every significant platform, I'd say it's not worth it. It's more versatile than sed and awk together. As for auto-splitting, you can do it in perl like this:

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

编辑: 您可能仍然希望让 有点熟悉 awk,因为其他一些工具基于它的基于模式的操作哲学(例如 Solaris 上的 DTrace)。

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

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

如果你在刮屏幕,那就太好了。事实上,我喜欢 AWK 可能是因为它能让我如此迅速地构建错误的问题解决方案:) 更多的例子。在乔恩 · 本特利的可爱的 编程珍珠中也提到了这一点。

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

Perl might be able to do a lot of things AWK can do, but offered the choice in this day and age I would choose Python here. So yes, you should learn AWK. but learn Python too :-)

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

如果您快速学习 awk 的基础知识,那么您确实可以在命令行中完成令人惊奇的工作。

但是 real学习 awk 的原因是有借口去读 superb的书 The AWK Programming Language由 Aho,Kernighan,和 Weinberger。

The AWK Programming Language at archive.org

你可能会认为,从名字来看,它只是教你走路。事实上,这只是个开始。一旦使用简洁的脚本语言使字符串操作变得容易ーー awk 是第一个ーー就可以解决大量的问题,而且它还可以教会读者如何实现一个数据库、一个解析器、一个解释器,以及(如果我没记错的话)一个针对特定项目的小型计算机语言的编译器!如果他们也用 awk 编写了一个示例操作系统,那么这本书将会是一本相当完整的计算机科学概论!

以简洁明了著称,就像原版的 C 语言书一样,它也是友好技术写作的绝佳例子。就连索引也是一项技艺。

什么?如果您知道它,您将偶尔在命令行中使用它,但是对于任何更大的东西,您都会感到受困,无法访问您的系统和类似 Python 提供访问的 Internet 的更广泛特性。但那本书呢?你会永远高兴你读它!

我工作的地区的文件都是列格式的。所以 awk 对我来说是非常宝贵的,它可以让不同的软件一起工作。对于非 IT 行业来说,使用 awk 就足够了。现在,计算机速度已经不是问题了,所以我可以将 awk 和 unix 结合起来,将许多1行命令导入到一个“脚本”中。使用 Awk 通过字段和记录进行搜索,我使用它来快速检查文件数据,而不是使用“ vi”来打开文件。我不得不说,awk 能力特别给我的工作带来了快乐,我能够帮助同事用 awk 快速地理清事情。对我来说是很棒的代码。

我最近试图可视化网络 pcap 文件记录一个 DOS 攻击,总计超过20Gbs。我需要时间戳和 IP 地址。在我的场景中,AWK一行程序工作得非常出色,速度也非常快。我特别使用 AWK来清理提取的文件,获取 IP 地址和总包计数从这些 IP 地址在分组的时间跨度。我完全同意其他人在上面写的东西。这取决于你的需要。

awk是一种动力工具语言,因此,如果您是任何类型的 IT 专业人员,您可能会发现 awk正在某个地方使用。如果您能够处理 grepsed的语法和正则表达式,那么您应该可以毫无问题地获取 awk,这可能是值得的。

我发现 awk真正的亮点在于简化了一些事情,比如处理多行记录和同时处理/插入多个文件。

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

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

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

基本任务可以通过基本 bash 命令,甚至 GUI 工具轻松地处理。更复杂的任务可以通过现代动态语言(如 Python (fav 或 mine)或 Ruby)轻松解决。

你一定要学习一门现代的脚本动态语言,因为它可以帮助你完成很多任务(web,管理,数据处理,自动化等等)。通过这样做,学习 awk 这样的工具是完全无用的,它最多每个月为您节省几秒钟。

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

我有一个 awk 代码,现在我必须重写,只是因为我突然调试,在 awk/gawk 中没有非贪婪匹配,因此它不能正确地执行一些正则表达式。

这取决于你的团队成员和你的领导者以及你所从事的工作。

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
}
}

目前我一直在用 python 编写代码。 But I still do not know it well enough to use easily for simple one off file transformations.

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

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

But anything that required many lines of code, I would resort to python.

我喜欢 awk,它是一个非常强大的工具,与 sed 结合在一起。

如果你关心速度,但不想处理 C/C++assembly,你去 awk,特别是 mawk 1.9.9.6

它还缺乏 perl的丑陋语法、 python3的特性膨胀、 javascript恼人的 UTF16设置或 C的内存指针陷阱

大多数时候,对于实现相同的伪代码,awk只会在专门的向量化指令(如 AVX/SSE)面前失败