还有什么理由学习AWK吗?

还有什么理由学习AWK吗?,awk,text-processing,Awk,Text Processing,我不断学习新的工具,甚至是老式的工具,因为我喜欢用正确的方法解决问题 然而,我不知道是否还有任何理由去学习其中的一些awk对我来说很有趣,但对于简单的文本处理,我可以使用grep、cut、sed,等等。而对于复杂的文本处理,我会选择Python 现在我不是说它不是一个强大和方便的工具。但是因为学习一个新工具需要时间和精力,值得吗?我确实经常使用awk。这对于在管道中间非常简单的文本改组是有好处的;它填补了一个非常狭窄的位置,介于根本不需要它和需要推出Perl/Python/任何东西之间 我不建议

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

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


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

我确实经常使用awk。这对于在管道中间非常简单的文本改组是有好处的;它填补了一个非常狭窄的位置,介于根本不需要它和需要推出Perl/Python/任何东西之间


我不建议你花很多时间在它上面,但是了解语法的基本知识可能会很有用——至少你可以在你想使用它的时候快速查阅手册。

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

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

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

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

没有

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


花点时间学习那些更强大的工具,只是顺便学点awk。我认为这取决于你所处的环境。如果你是一个*nix人,那么了解
awk
是一件好事。几乎在每个*nix上都可以找到的唯一其他脚本环境是
sh
。因此,虽然
grep
sed,
etc肯定可以取代现代主流
linux
发行版上的
awk
,但当您转向更奇特的系统时,了解一点
awk
将非常方便

awk
还可用于不仅仅是文本处理。例如,我的一位主管在
awk
中编写了天文学代码——这就是他是多么的老派和令人敬畏。在他那个时代,这是最好的工作工具。。。现在,即使他的学生像我一样使用python什么的,他还是坚持他所知道的,并且工作得很好


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

如果你已经知道并使用sed,那么你最好至少学一点awk。它们可以通过管道连接在一起,实现一些非常强大的技巧。总是给观众留下深刻印象。

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


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

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

e、 g

awk-F\t'{if($2>$3)print;}'
仅当制表符分隔文件中的第二列值大于第三列值时,才会打印

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


学习awk的成本也很低。您可以在不到一个小时的时间内学习awk基础知识,因此与学习任何其他编程/脚本语言相比,学习awk基础知识的工作量要小得多。

大多数awk一行程序都可以通过Perl一行程序实现—如果您选择Perl一行程序的思维方式。或者,只需使用Perl三行程序:)

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


即使没有实际的需要,如果你已经知道regex,也不会花很长时间去学习基本知识,看看当时的设计是多么有趣。它相当优雅。

当然:我工作的环境中,唯一可用的语言是:(一些生成COBOL、OMG、OMG的蹩脚语言)、bash(旧版本)、perl(我还不精通)、sed、awk和其他一些命令行实用程序。了解awk可以帮我节省几个小时(而且我的同事们也帮我完成了几个文本处理任务——他们每天至少来我这里三次)

计算机世界最近与Alfred V.Aho(AWK的三位创作者之一)就AWK进行了一次调查。这是一本很有趣的书。因此,也许您会在其中找到一些提示,为什么学习AWK是个好主意。

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

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="" }
BEGIN{s=”“;FS=“n”}
//, ""); s=(s“,”$1);}

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

Perl可能能够做AWK可以做的很多事情,但在这方面提供了选择
awk -F \t '{ if ($2 > $3) print; }' <filename>
perl -F':' -ane 'print $F[3],"\n";' /etc/passwd
BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }
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
  }
}