仍然有任何学习AWK的理由吗?


109

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

尽管如此,我想知道是否仍然有任何理由学习其中的一些。awk例如是对我有意思,但对于简单的文本处理,我可以使用grepcutsed等而复杂的,我会去为Python。

现在,我并不是说这不是一个强大而便捷的工具。但是由于学习新工具需要时间和精力,是否值得


2
这是2019年,我只是在awk中重写了一个python日志规范化器。我对一周的日志文件(5400万行日志文件(约9GB))进行了转换。在我的Macbook Pro(2.8 GHZ i7,16 GB Ram)上,python版本每秒可处理约10k行=> 90分钟的运行时间。使用mawk,运行时间减少到2分钟。顺便说一句,awk程序的大小只有一半。
mistahenry

@mistahenry您尝试过pypy吗?
qwr

Answers:


97

我认为这取决于您所处的环境。如果您是* nix人,那么知道awk是一件好事。几乎每个* nix上都可以找到的唯一其他脚本环境是sh。因此,虽然grepsed,等一定能够代替awk对现代主流linux发行版,当你移动到更奇特的系统,知道一点点awk将是真正的得心应手。

awk不仅可以用于文本处理,还可以用于其他用途。例如,我的一位主管在其中编写天文学代码,awk这就是他的学历成就。早在他的时代,它是工作的最佳工具……现在,即使像我这样的学生使用python,但不使用python,他仍然坚持自己所知道的并且运作良好。

最后,世界各地有许多旧代码在起作用,只要知道一点点awk就不会受到伤害。它也会使你变得更好*尼克斯人:-)


12
++同意,awk确实是* nix工具集中最可移植的工具,而且重要的是一致的工具。例如,它在busybox上可靠地工作,在哪里找不到perl。

1
而且,如果您习惯了花括号语言,学习起来也不难
枪枝

2
“在任何环境中都是相同的”-并非完全如此:在Windows中,单引号必须替换为double,s,并且必须转义内部double。(Windows是一种真实的环境,即使将自己暴露于Redmond不安全的半成品暴行之下,您也会受到任何15岁的俄罗斯人的摆布)。
GT。

6
我认为没有多少人将awk和Windows的存在联系在同一个宇宙中.....:P
FoldedChromatin

2
仍在使用awk进行文本处理作业。我通常会以其他方式(ruby,python)启动脚本,最后为了简单和强大而回到awk。
Rumbleweed

104

如果您快速学习了awk的基础知识,那么您确实可以在命令行上做一些很棒的事情。

但是学习awk 的真正原因是有借口阅读其作者Aho,Kernighan和Weinberger撰写的极好的书籍《 AWK编程语言》。从名称上,您会认为它只是教给您awk。实际上,这仅仅是开始。一旦使用了简洁的脚本语言就可以解决各种各样的问题,而这种脚本语言使字符串操作变得容易(而awk是最早的语言之一),它可以教读者如何实现数据库,解析器,解释器。 ,以及(如果有内存的话)一个针对特定项目的小型计算机语言的编译器!如果仅他们还使用awk编写了示例操作系统的书,那本书将是对计算机科学的相当完整的介绍!

像原始的C语言书一样,它清晰,简洁而著名,它也是正确完成友好技术写作的一个很好的例子。甚至索引也是一项技巧。

啊 如果知道的话,您偶尔会在命令行上使用它,但是对于更大的东西,您会感到被困,无法访问系统的广泛功能以及类似Python所提供的Internet。但是那本书呢?您将永远很高兴阅读它!


5
+1出售。我要订购这本书。多年来,我一直将awk用作一种快速而强大的单行脚本语言。Awk是一个很好的文件预处理器,否则将花费十几行代码。我无法计算使用该表格的次数:awk'{print $ 1,$ 2}'
galaxywatcher 2010年

2
同意 它几乎无视信念,使本书所含的全部内容多么紧凑。它涵盖了比大多数当代书籍多1/10(?)的长度。
粘土

3
我现在正在读这本书,这激起了我对awk的热情,几乎迷恋了。
galaxywatcher 2012年

3
另请参见出色的Gawk:有效的AWK编程
lhf 2012年

1
我刚读了第一章。太神奇了 先生解决了。
vaichidrewar

29

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

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

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

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

3
为什么用awk '{print $3}' < file.in代替awk '{print $3}' file.in?作为参数传递时,awk尚未读取文件吗?
mbigras

@mbigras当然,您可以使用awk的任何一种方式。
Greg Hewgill '17

即使使用doublesize,我也喜欢非awk解决方案。而且我不知道为什么我讨厌awk:/
MD。Mohiuddin Ahmed

25

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

例如

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

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

当然,我可以使用Perl或Python,但是awk通过简洁的单行命令使其变得更加简单。

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


尽管我并没有真正使用awk,但这对于awk来说是一个很好的用途。
保罗·内森

8

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

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

如果您要抓取屏幕,那就太好了。实际上,我可能喜欢AWK,因为它可以让我如此迅速地为问题建立错误的解决方案:) 更多示例。乔恩·本特利(Jon Bentley)的《Programming Pearls》也提到了这一点。


7

我确实经常使用awk。这对于在管道中间进行非常简单的文本混排很有用;在完全不需要它和需要淘汰Perl / Python /任何东西之间,它填补了一个非常狭窄的领域。

我不建议您花很多时间在上面,但是了解语法的基础可能会很方便-至少足以让您在想要使用该手册时可以快速查阅该手册。


5

大多数awk one衬里都可以使用Perl one衬里来实现-如果您选择进入Perl one衬里的思维定式。或者,只需使用Perl三个衬里:)

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

即使没有实际需要,如果您已经知道regex,也不会花很长时间就可以掌握基础知识,并且看到那时的设计是很有趣的。相当优雅。


5

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

基本任务很容易处理,但基本的bash命令甚至GUI工具都很容易。使用现代动态语言,例如Python(常用或我的)或Ruby,可以轻松解决更复杂的任务。

您应该明确学习一种现代脚本动态语言,因为它可以帮助您完成许多任务(Web,管理,数据处理,自动化等)。通过这样做,完全无法使用诸如awk之类的工具,它每月最多可以为您节省几秒钟。


2
不一定正确。如果要解析很大的文件,它可能比其他工具快得多。
user1071847 '18 -10-3

有趣,因为在此之后的几年中,您仍然在询问有关awk的问题。我是最初的响应者之一,至今仍定期使用它
-Dexygen

4

如果您已经知道并使用sed,则不妨至少花一点点的awk。可以将它们通过管道传输在一起,以获得一些非常强大的技巧。总是给观众留下深刻的印象。


4

Computerworld最近对Alfred V. Aho(AWK的三位创作者之一)进行了有关AWK 的采访。这是一个非常有趣的阅读。因此,也许您会在其中找到一些提示,为什么学习AWK是个好主意。


很好,但是没有说服我。AWK是一个非常好的工具,但是我认为我永远不需要花时间来学习它,而不必用sed或python破解我的解决方案。
e-satis's

4

在我的最后一份合同中,我在一个未安装Perl或大多数其他脚本语言的嵌入式Linux系统上工作,学习AWK对我来说是无价的。


2
9年后,今天我在使用git日志时
经常

3

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

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


2

如果您在shell脚本编写时偶尔需要解析日志文件以获取数据或程序输出,则此功能非常有用,因为在awk中非常容易实现,这将使您在python中花费更多代码。

它肯定比这具有更多的功能,但这似乎是大多数人使用它的任务。


2

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


1

我会说这可能不再值得了。我不时使用它作为比sed具有更多搜索功能的通用流编辑器,但是如果您精通python,我不知道您可以更快完成此任务以补偿所需时间的任务。学习awk。

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

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

1

不。

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

花时间学习那些更强大的工具-顺便说一句,只是偶然地学会了一些知识。


1

我会说有。对于简单的东西,没有经验的sysadmin / developer上的AWK比Python容易得多。您可以学习一点AWK并做很多事情,学习Python意味着学习一种全新的语言(是的,我知道AWK也是一种语言)。

Perl也许可以做AWK可以做的很多事情,但是提供了当今的选择,我会在这里选择Python。是的,您应该学习AWK。但是也要学习Python :-)


1

awk是Powertool的一种语言,因此,awk如果您是任何IT专业人员,都可能会在某处使用它。如果你能处理的语法和正则表达式grepsed那么你应该没有问题捡awk它可能是值得的。

我发现awk真正的亮点在于简化诸如处理多行记录以及同时处理/插入多个文件之类的事情。


0

现在,PERL已移植到几乎所有重要平台上,我认为这是不值得的。它比sed和awk在一起功能更强大。对于自动拆分,您可以在perl中执行以下操作:

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

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


0

我在工作区域文件是列格式。因此,awk对我重新格式化文件非常宝贵,因此不同的软件可以一起工作。对于非IT专业人员,使用awk足够且完美。如今,计算机速度已不再是问题,因此我可以结合使用awk和unix将很多1个内衬命令通过管道传递到“脚本”中。通过按字段和记录进行Awk搜索,我用它来非常快速地检查文件数据,而不是用“ vi”打开文件。我不得不说awk功能特别为我的工作带来了快乐,我能够协助同事使用awk快速地解决问题。给我的惊人代码。


0

我最近试图可视化记录pDOS文件的网络pcap文件,该攻击总计超过20Gbs。我需要时间戳和IP地址。在我的场景中,AWK单线工作非常好,而且速度也很快。我专门使用AWK来清理提取的文件,在分组的时间跨度内从这些IP地址获取IP地址和总包数。我完全同意其他人在上面写的内容。这取决于您的需求。


0

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

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


0

这取决于您的队友,领导者以及您正在执行的任务。

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

0

我目前正在用python做一些编码。但是我仍然不太了解它是否可以轻松地用于简单的脱文件转换。

使用awk,我可以在unix命令行上快速开发一行代码,进行一些相当复杂的转换。每次我使用awk时,我编写的代码段都是一次性的,并且长度不超过几行。可能在此一行上或该行上有一个“ if”语句和“ printf”语句。

我从未用awk编写过超过10行的代码。几年前,我看到了一些这样的脚本。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.