awk简介:
awk是贝尔实验室1977年搞出来的文本神器,对于熟悉使用linux的朋友们来说,awk无疑是强大的。说到awk,就不得不提到一本书。《the awk programming language》据说这本书要将近1k呢。好吧,我没看过。其实linux下有很多强大的文本编辑工具包括(sed |nl |ed |tr |cut |fold |strings等等)先从awk开始吧
【参考手册可以看看下面的链接地址】
http://www.gnu.org/software/gawk/manual/gawk.html#Built_002din-Variables
http://www.gnu.org/software/gawk/manual/gawk.html#Statements
http://www.gnu.org/software/gawk/manual/gawk.html#Built_002din
http://www.gnu.org/software/gawk/manual/gawk.html#Regexp
awk程序结构
AWK是一种处理文本文件的语言。它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式,并执行符合的模式所对应的动作。
awk程序是由一系列模式--动作对组成的,写做:pattern { action}
其中pattern
表示AWK在数据中查找的内容,而action
是在找到匹配内容时所执行的一系列命令。输入行被分成了一些记录:记录默认由换行符分割,因此输入会按照行进行分割。程序使用给定的条件一个个的测试每条记录,并执行测试通过的条件所对应的action
。pattern
和action
都可以省略不写。无pattern
默认匹配全部的记录;而无action
则是打印原始记录。简单的AWK表达式之外,pattern
可以是BEGIN
或END
;这两种条件对应的action
分别是读取所有的记录之前和之后。同时,如pattern1, pattern2
的条件表示符合条件pattern1
和pattern2
的记录及其之间的部分。
开始实战一下吧:
以/etc/password文件为例:我需要打印用户名和用户所在的gid号。
其中单引号中的{}就是awk语句,且只能用单引号包含
这里我使用-F参数指定吧 “:”作为域的分隔符。$1....$n表示第几个域。$0表示整个行。
匹配输入行中的范围
yes命令代表重复其参数,默认为"y",这里我们让其输出"root and /bin/bash",动作快输出带有行号的内容。NR会记录行号从1开始。“%”求模操作符。所以,NR % 4 ==1对第1,5,9为真。类似的像,NR % 4 ==3对3,7,11等为真。范围模式在其第一部分匹配之前为假,并在第二部分匹配之前为真。然后再第二次匹配上其第一部分前为假。而sed命令测试用于截取其前7行的输出,否则yes命令会一直重复下去,当然也可以用head命令,等效于head -n7.
关于内置变量:
如何过滤记录:
&&代表同时成立,==是比较运算符号,比如:!= |> |< |>= |<=
这里我们可以引入内置变量NR:
指定域分隔符匹配
-F参数等效于BEGIN{FS=":"},可以同时指定多个分隔符,awk -F ‘[,:]‘
下面以\t作为域分隔符,\t即tab键
未完待续