仍然有任何学习AWK的理由吗?
我一直在学习新的工具,甚至是老式的工具,因为我喜欢为问题使用正确的解决方案。
尽管如此,我想知道是否仍然有任何理由学习其中的一些。例如," awk"对我来说很有趣,但是对于简单的文本处理,我可以使用" grep"," cut"," sed"等。对于复杂的文本,我将使用Python。
现在,我并不是说这不是一个强大而便捷的工具。但是由于学习新工具需要时间和精力,是否值得?
解决方案
我确实经常使用awk。这对于在管道中间进行非常简单的文本混排很有用;它填补了一个非常狭窄的利基市场,介于根本不需要它和需要淘汰Perl / Python /任何东西之间。
我不建议我们花很多时间在上面,但是了解语法的基础可能会很方便-至少足以让我们在想要使用该手册时可以快速查阅该手册。
我使用awk
的唯一原因是自动拆分:
awk '{print }' < file.in
这将在file.in
中打印第三个以空格分隔的字段。它比以下要容易一些:
tr -s ' ' < file.in | cut -d' ' -f3
我会说这可能不再值得了。我不时使用它作为比sed具有更多搜索功能的通用流编辑器,但是如果我们精通python,我不知道我们可以更快完成此任务以补偿所需时间的任务。学习awk。
以下命令可能是我最近两年使用过awk的唯一命令(它从Debian / Ubuntu系统中清除了一半删除的软件包):
$ dpkg -l|awk '/^rc/ {print }'|xargs sudo dpkg -P
没有。
尽管可能很有趣,但是我们可以使用其他更强大的工具(例如Perl)来完成awk可以做的所有事情。
花时间学习那些更强大的工具,而只是在过程中偶然发现了一些awk。
我认为这取决于我们所处的环境。如果我们是* nix人,那么知道awk
是一件好事。几乎每个* nix上都可以找到的唯一其他脚本环境是sh
。因此,尽管grep
,'sed'等可以肯定地代替现代主流linux
发行版上的awk
,但是当我们迁移到更多的外来系统时,知道一点awk
将会是真正的方便。
" awk"不仅可以用于文本处理,还可以用于其他用途。例如,我的一位主管在" awk"中编写了天文学代码,这就是他的学历和成就。早在他的时代,它是工作的最佳工具……现在,即使像我这样的学生使用python,也没有使用python,他仍然坚持自己所知道的并且运作良好。
最后,世界各地有许多旧代码在运行,知道一点" awk"不会受到伤害。它也会使你变得更好*尼克斯人:-)
如果我们已经知道并使用sed,则不妨至少花一点点的awk。可以通过管道将它们组合在一起,以获得一些非常强大的技巧。总是给观众留下深刻的印象。
如果我们在shell脚本编写时偶尔需要解析日志文件以获取数据或者程序输出,则此功能非常有用,因为在awk中很容易实现这一点,而这将使我们在python中花费更多的代码行。
它肯定比这具有更多的功能,但这似乎是大多数人使用它的任务。
我认为如果文件包含列/字段,awk很棒。我在处理/分析多列文件中的特定列时使用它。或者,如果我想添加/删除特定的列。
例如
awk -F \t '{ if ( > ) print; }' <filename>
仅当制表符分隔文件中的第二列值大于第三列值时,才会打印。
当然,我可以使用Perl或者Python,但是awk通过简洁的单行命令使其变得更加简单。
学习awk也是很便宜的。我们可以在不到一个小时的时间内学习awk的基础知识,因此它不像学习任何其他编程/脚本语言那样费劲。
如果我们选择进入Perl one衬套思维模式,则大多数awk one衬套都可以使用Perl one衬套来实现。或者,只需使用Perl三个衬里:)
如果我们要维护由喜欢awk的人编写的shell脚本,那么显然,我们将需要学习awk。
即使没有实际需要,如果我们已经知道regex,也不会花很长时间就可以掌握基础知识,并且看到那时的设计是很有趣的。相当优雅。
当然:我正在一个唯一可用的语言环境中工作:(一些生成COBOL,OMG,OMG的肮脏语言),bash(旧版本),perl(我还不掌握),sed,awk ,以及其他一些命令行实用程序。知道" awk"可以节省我几个小时的时间(并从我的同事那里产生了一些文本处理任务,他们每天至少要来我这里三次)。
Computerworld最近对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 ", " );} /<tr|<TR/ { print s; s="" }
如果我们要抓取屏幕,那就太好了。实际上,可能是因为我喜欢AWK,因为它允许我如此迅速地为问题建立错误的解决方案:)更多示例。乔恩·本特利(Jon Bentley)的《 Programming Pearls》中也提到了这一点。
我会说有。对于简单的东西,没有经验的sysadmin / developer上的AWK比Python容易得多。我们可以学习一点AWK并做很多事情,学习Python意味着学习一种全新的语言(是的,我知道AWK也是一种语言)。
Perl也许可以做AWK可以做的很多事情,但是提供了当今的选择,我会在这里选择Python。是的,我们应该学习AWK。但是也要学习Python :-)
在我的上一份合同中,我在一个未安装Perl或者大多数其他脚本语言的嵌入式Linux系统上工作,学习AWK对我来说是无价的。
如果我们快速学习了awk的基础知识,那么我们确实可以在命令行上做一些很棒的事情。
但是学习awk的真正原因是有借口阅读其作者Aho,Kernighan和Weinberger撰写的极好的书籍《 AWK编程语言》。从名称上,我们会认为它只是教给我们awk。实际上,这仅仅是开始。一旦使用了简洁的脚本语言使字符串操作变得容易,awk就可以解决许多问题,而awk则是教读者如何实现数据库,解析器,解释器以及(如果有内存可用的话)一个针对特定项目的小型计算机语言的编译器!如果只有他们还使用awk编写了示例操作系统,那本书将是对计算机科学的相当完整的介绍!
像原始的C语言书一样,它清晰,简洁而著名,它也是正确完成友好技术写作的一个很好的例子。甚至索引也是一项技巧。
啊如果知道的话,我们偶尔会在命令行上使用它,但是对于更大的东西,我们会感到被困,无法访问系统的广泛功能以及Python之类提供的Internet。但是那本书呢?我们将永远很高兴阅读它!