还有什么理由要学习AWK吗?
我不断学习新的工具,甚至老式的工具,因为我喜欢用正确的解决scheme解决问题。
不过,我想知道是否还有理由去学习其中的一些。 例如awk
对我来说很有趣,但是对于简单的文本处理,我可以使用grep
, cut
, sed
等,而对于复杂的,我会去Python。
现在我不是说这不是一个强大而方便的工具。 但是,由于学习新工具需要时间和精力, 是否值得呢 ?
我认为这取决于你所处的环境。如果你是一个* nix的人,那么知道awk
是一件好事。 几乎每个* nix都可以find的唯一的其他脚本环境是sh
。 所以,虽然grep
, sed,
等可以在现代主streamlinux
发行版中取代awk
,但是当你移植到更加奇特的系统时,知道一点awk
就会成为Real Handy。
awk
也可以用于不仅仅是文本处理。 例如,我的一位主pipe在awk
写了天文学的代码 – 那是多么的老派和真棒 。 回到他那个时代,这是工作最好的工具……而现在,即使他的学生们喜欢我使用python,而不是,他坚持他所知道的并且运作良好。
最后,世界上有很多旧的代码踢,知道一点awk
不会受到伤害。 它也将使你更好*尼克斯人:-)
如果你快速学习awk的基础知识,你确实可以在命令行上做出惊人的事情。
但学习awk的真正原因是有一个借口来阅读其作者Aho,Kernighan和Weinberger 的AWK编程语言 。 你会想,从名字来看,它只是教你awk。 其实这只是个开始。 一旦用户使用简洁的脚本语言轻松实现string操作,并且awk是第一个,那么就可以解决大量可以解决的问题 – 向读者教授如何实现数据库,parsing器,解释器,(如果内存服务于我的话)编译器,用于小型项目特定的计算机语言! 如果他们也只是用awk编写了一个操作系统的例子,那么这本书就是对计算机科学的一个相当完整的调查介绍!
像C语言原书一样清晰简洁,也是友好技术写作的绝佳例证。 即使是指数是一块工艺。
AWK? 如果你知道的话,你偶尔会在命令行中使用它,但是对于更大的事情你会感到困惑,无法访问像Python提供的访问系统和Internet的更广泛的function。 但是这本书? 你会永远很高兴你读了!
我使用awk
的唯一原因是自动分割:
awk '{print $3}' < file.in
这将在file.in
打印第三个以空格分隔的字段。 这比以下更容易:
tr -s ' ' < file.in | cut -d' ' -f3
我觉得awk是伟大的,如果你的文件包含列/字段 。 在处理/分析多列文件中的特定列时使用它。 或者如果我想添加/删除一个特定的列。
例如
awk -F \t '{ if ($2 > $3) print; }' <filename>
将仅在选项卡分隔文件中的第二列值大于第三列值时才打印。
当然,我可以使用Perl或Python,但awk使简单的单行命令变得更简单。
另外学习awk相当便宜。 你可以在不到一个小时的时间内学习awk的基础知识,所以它不像学习任何其他编程/脚本语言那样费力。
我经常使用awk。 在stream水线中间进行非常简单的文字洗牌是很好的。 它填补了一个非常狭窄的利基权利之间根本不需要它,需要鞭出Perl / Python /无论。
我不会build议你花很多时间在上面,但是知道这个语法的基础知识可能会派上用场,至less你可以在想要使用它的时候快速查阅这个手册。
我偶尔使用AWK来处理HTML。 例如,这段代码将表转换为csv文件:
BEGIN {s=""; FS="n"} /<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);} /<tr|<TR/ { print s; s="" }
如果你是屏幕抓取,这是非常棒的。 实际上,我可能会喜欢AWK,因为它可以让我快速地构build错误的解决scheme:) 更多的例子 。 Jon Bentley的可爱编程珍珠也提到了这一点。
大多数awk一行可以用perl来实现,如果你selectPerl一行的思路。 或者,只需使用Perl三行:)
如果你正在维护由喜欢awk的人编写的shell脚本,那么显然,你将需要学习awk。
即使没有实际的需求,如果你已经知道正则expression式,不需要很长的时间来获取基础知识,而且看到事情是如何devise的,这是很有趣的。 这相当优雅。
如果你已经知道并使用了sed,那么你最好还是至less拿一点awk。 他们可以一起使用一些非常强大的技巧。 总是给观众留下深刻印象。
我会说这可能不值得了。 我不时使用它作为一个更多function的stream编辑器而不是searchfunction,但是如果你精通python,我不知道你将能够完成的任务更快,以弥补所需的时间学习awk。
以下命令可能是我在过去两年中使用awk的唯一一个(它从Debian / Ubuntu系统中清除了一半的包):
$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P
如果在shell脚本时偶尔需要parsing日志文件以获取数据或程序输出,这很有用,因为在awk中实现这一点非常简单,这将使您在python中获得更多的代码行。
它当然有更多的权力,但这似乎是大多数人使用它的任务。
当然,我正在这样一个环境中工作,只有这些语言是:(一些生成COBOL,OMG,OMG的shity语言),bash(旧版本),perl(我还没掌握它),sed,awk ,和其他一些命令行工具。 知道awk
我节省了几个小时的时间(并且从我的学校里产生了几个文本处理任务 – 他们每天至less要来三次)。
Computerworld最近对AWK的Alfred V. Aho(AWK的三位创造者之一)进行了采访 。 这是一个非常有趣的阅读。 所以也许你会发现一些提示,为什么学习AWK是一个好主意。
学习AWK对我来说是非常宝贵的,因为我在上一个没有安装Perl和大多数其他脚本语言的embedded式Linux系统上工作。
问这个问题6年后,我现在可以肯定地回答:不,学习awk是不值得的。
基本的任务是处理,但基本的bash命令,甚至是简单的GUI工具。 用Python(fav或mine)或Ruby等现代dynamic语言可以轻松解决更复杂的任务。
你应该明确地学习现代脚本dynamic语言,因为它可以帮助你完成许多任务(networking,pipe理,数据处理,自动化等)。 而通过这样做学习awk等工具完全没用,每个月最多可以节省几秒钟。
不。
尽pipe这可能很有趣,但是可以使用其他更强大的工具(比如Perl)来完成awk所能做的一切。
花时间学习那些更强大的工具 – 而且只是顺便提一些awk。
我会说有。 对于简单的东西来说,对于没有经验的系统pipe理员/开发者来说,AWK比Python更容易。 你可以学习一点AWK并做很多事情,学习Python意味着学习一种全新的语言(是的,我知道AWK也是一种语言)。
Perl可能能够做AWK可以做的很多事情,但是在这个时代提供了select,我会在这里selectPython。 所以是的,你应该学习AWK。 但也学习Python 🙂
awk具有非常好的效用/难度,“simple awk”适用于每个Unix / Linux / MacOS(也可以安装在其他系统中)。
它被devise在黄金时代,人们讨厌打字,所以剧本可以非常短而且快速地写。 我会尝试安装mawk,一个快速的版本,据称它加速计算大约9次,awk / gawk是相当慢,所以如果你想使用它而不是R等你可能要mawk。
现在,PERL已经移植到几乎所有重要的平台上,我认为这不值得。 它比sed和awk更通用。 至于自动分裂,你可以在perl中这样做:
perl -F':' -ane 'print $F[3],"\n";' /etc/passwd
编辑:你可能还是需要熟悉一下awk,因为其他一些工具是基于基于模式的操作(比如Solaris上的DTrace)。
我在区域工作的文件是列格式。 所以awk对于REFORMAT文件是非常宝贵的,所以不同的软件可以一起工作。 对于非IT行业来说,使用awk已经足够和完善了。 现在一天,电脑速度不是问题,所以我可以结合使用awk和unix来把许多命令转换成一个“脚本”。 使用awk按字段search和logging,我用它来快速检查文件数据,而不是“vi”来打开一个文件。 我不得不说,awk能力特别给我的工作带来了欢乐,我能够协助同事使用awk快速sorting。 令人惊叹的代码给我。
我最近试图查看logging了超过20Gbs的DOS攻击的networkingpcap文件。 我需要时间戳和IP地址。 在我的情况下, AWK单线程工作得非常好,速度也非常快。 我专门用AWK来清理提取的文件,在分组的时间段内从这些IP地址获取IP地址和总包数。 我完全同意其他人上面写的。 这取决于你的需求。
awk
是一个powertool语言,所以如果你是一个IT专业人员,你可能会发现awk
被用在某个地方。 如果你能处理grep
和sed
的语法和正则expression式,那么你应该没有问题了,这可能是值得的。
我发现awk
真正的亮点在于简化诸如处理多行logging和同时修改/插入多个文件等事情。
学习awk的一个原因是在正则expression式中没有非贪婪的匹配。
我有一个awk代码,现在我必须重写,因为我突然debugging了awk / gawk中没有非贪婪的匹配,所以它不能正确地执行一些正则expression式。