分类: LINUX
2014-11-16 18:20:20
awk命令的一般格式为
awk ‘/pattern/ {action}/pattern1/{action1}’ datafile1 datafile2
awk可以同时指定多个匹配条件和处理动作(规则),每条规则之间可以另起新行分割,只要将它们包含在同一单引号里面即可。awk可以同时处理多个文件对象。
如果省略{action},则awk默认打印所有匹配pattern的行。如果想要指定不作任何事情,怎可省略action的同时,只保留{}。
2. 有三种方法运行awk程序。
awk‘program’ datafile1 datafile2 …
这里的program即pattern和action的组合,方式如前述。
awk–f program-file datafile1 datafile2 …
适用于程序较为复杂的情形。将/pattern/{action}组合放入program-file(不需要加单引号)后即可调用。为了使程序文件一目了然,可使用后缀名.awk。
将awk程序写为脚本文件后执行。
在脚本文件行首加上 #!/bin/awk –f,然后BEGIN{}块指定主程序执行的先决条件,中间是主程序,最后是END{}块指定结束操作。运行时,按脚本方式运行,并在后面指定输入文件。
需要注意的是,awk脚本和脚本中执行awk语句是不同的,前者使用awk程序的语法规则;后者只是将前两种用法写入文件执行,遵从shell脚本的语法规则。
3.读入文件时,除了使用默认的方式按行读入Record,也可以指定其它的Record Separator。
awk ‘BEGIN {RS = “/”}; {print $0}’ datafile
使用awk内置变量RS指定新的Record分割符为/。因为awk打印时在每一条Record后重起新行,这样通过指定新的分割符,就为datafile添加了新的换行。特别地,若指定RS为空字符,则以空行为分割符。awk利用内置变量FNR追踪当前读入的行号(记录号)。每次读入新文件时,FNR将自动置为0。另外一个变量NR记录当前awk一共读入了的行数(记录数),该变量从0开始,但即使读入新文件也不会重新置0。如果在主程序中重新设定了RS,则只会影响设定后读入的内容。
4.对于读入的每一行(记录),awk默认以(一个或多个)空格/制表符为分段符将其划分为若干段(Field),每一段可使用$number进行引用和访问,其中number可以是可计算数值的变量或表达式。$0对应整条记录,$NF对应最后一个分段。如果记录号大于总分段数,则返回空字符,但可以对其进行赋值操作后打印。注意,不带$的NF对应一个内置变量,它的值是当前记录的分段数量。例如:
awk ‘$1 ~ /pattern/ {print $!, $NF} ’ datafile
awk ‘$1 ~ /pattern/ {print $!, $NF} ’ datafile上例中打印datafile中所有行中首个分段包含pattern的行的第一个分段和最后一个分段。~是匹配运算符,它检验给定字符串($1)是否匹配之后的正则表达式。除了默认的分割符,awk允许指定字符或正则表达式作为分割符。分割符不出现在分段中。awk使用内置变量FS指定段分割符。
awk ‘BEGIN {FS = “:”}; {print $0}’ datafile使用命令行指定分割符时,可使用参数–F。
awk –F, ‘/pattern/{action}’ datafile上例指定“,”为段分隔符。
5. 使用print打印多个分段时,默认以空白作为间隔符,但也可以使用内置变量OFS(output fieldseparator)显式指定其它间隔符。类似的多个记录之间也可以指定默认的换行符之外的其它字符串。
awk ‘BEGIN {OFS = “;”; ORS=“\n\n”; OFMT = “%d” }{print $1, $2}’ datafile除了OFS,本例中ORS是记录之间的间隔符。
OFMT则是处理数字时的打印格式。但实际上,我们通常用printf来格式化打印内容。它可以为每一个分段指定宽度,指定数字的打印格式(基数、指数形式等等)。用法如下:
awk ‘{print format item1, item2…}’
awk ‘{print format item1, item2…}’和print不同,printf不会在打印完一条记录后自动添加换行,并且OFS和ORS将失去其作用。format的指定方式和C语言中printf函数的format用法相同。
awk ‘{printf “%-10s %s\n”, $1, $2}’ datafile
awk ‘{printf “%-10s %s\n”, $1, $2}’ datafile本例中,将分段1打印为最小宽度为10个字符的字符串,若不够则在左边补足空白符(不带-时在右边补足空白符)。然后空格后直接打印分段2。最后插入换行符后继续处理下一条记录。另外,还可以利用 >, >>和|操作符重定向print及printf的输出。例如:
awk ‘{ print $1 > “output_file_name”printf format $2 | “sort –r >> output_file_name_1”}’ datafile