AWK常用技法

AWK 作为linux下的一款优秀的工具,在文本处理方面拥有天然的优势。此文是我本周业余时间学习、整理而成。作为一名程序新手,对这款上古神器难免有理解不到的地方,不正确之处,劳烦斧正。

前情提要

本文将使用歌曲Color Blind的歌词作为AWK待处理的文本源,原因其一是我最近成功的被楼下理发店的这首歌洗脑;其二就是歌词比较有特点,适合用来说明AWK的用法。你可以在点击这里下载我整理过后的歌词:ColorBlind.txt

剧情铺垫

想要了解一个命令,首先需要知道它的一些约定俗成的规定。这就是linux中命令强大的部分原因,你可以一步一步的告诉我怎么做,也可以简明扼要,我会有默认的、最贴近大众化需求的处理方法。

以下是AWK的一些默认规则:

单纯的文字毕竟会枯燥,不过有了上面的这些基础,我们可以进入AWK这幕大剧了。

剧情深入

高潮

AWK的技巧可不仅如此,我们玩一些更复杂的。

假设ColorBlind这首歌的歌词创作者从初稿到终稿经过了n多个版本,命名大致如下:

    ColorBlind1.txt
    ColorBlind2.txt
    ColorBlind3.txt
    ColorBlind4.txt
    ColorBlind_don't_change.txt
    ....
    ColorBlind_nerver_change.txt
    ColorBlind_last_change.txt
    ColorBlind_fu*k.txt
    ColorBlind_dead.txt

作者想将其备份到路径/color/backup/目录下,并且每个文件需要添加.dat后缀表示为备份文件,即ColorBlind1.txt->ColorBlind1.txt.dat

通过AWK来实现的思路可以是根据文件名称组装mv命令,然后通过csh来执行

    ls ColorBlind* | awk '{print "mv "$0" /color/backup/"$0".dat"}' | csh

其实AWK命令可以写的很复杂,通常一行命令可能不会满足需求,所以AWK同时也提供了从文件读取命令的方式,甚至可以自定义函数,这里不做过多介绍, 因为过于复杂的逻辑通过bash 、python之类也未尝不可。选择什么只是业务需要与便捷之间的权衡。

结局

文章到了最后,我们也仅仅是对AWK有了初步了解,更多细节还待认真学习,但所谓万法皆空,因果不空,执行下面的命令,结束我们AWK的学习吧:

awk '{line[$0]++} END{for(i in line) delete line[i]}' ColorBlind.txt > ColorBlind.txt

参考

http://intro-to-awk.blogspot.jp/

http://coolshell.cn/articles/9070.html

http://www.infoworld.com/article/2985804/linux/remember-sed-awk-linux-admins-should.html