搜尋此網誌

2010年12月28日 星期二

bash学习笔记(五)—— awk

awk简介

awk命令行的程序模型

awk [-F field-separator] 'commands' input-file(s)-F 指定域分隔符,可选,默认为空格。
commands的命令格式为:/pattern/{actions} 
condition{actions}pattern是正则表达式,actions是一系列操作。
awk程序一行一行读出待处理文件,如果某一行与pattern匹配,或者满足condition条件,
则执行相应的actions,如果一条awk命令只有actions部分,则actions作用于待处理文件的每一行。
例:
testfile文件内容为
ProductA  30  aaa
ProductB  76  bbb
ProductC  55  ccc
打印每一行的第二列:
$ awk '{print $2;}' testfile
30
76
55
自动变量$1$2分别表示第一列、第二列等,类似于Shell脚本的位置参数,而$0表示整个当前行。
$ awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile
ProductA 30 aaa REORDER
ProductB 76 bbb
ProductC 55 ccc REORDER
awk命令的condition部分还可以是两个特殊的conditionBEGINEND,对于每个待处理文件,BEGIN后面的actions在处理整个文件之前执行一次,END后面的actions在整个文件处理完之后执行一次。
awk 'BEGIN {print "name belt -----"}{print $1" "$3} END {print "end"}' testfile
name belt -----
ProductA aaa
ProductB bbb
ProductC ccc
end

ps: 注print与printf的区别

初次awk时,可能会经常出现错误,在碰到错误时,可以按以下方式查找:

!确保整个awk命令用单引号括起来
!确保命令内所有引号成对出现
!确保用花括号括起动作语句,用圆括号括起条件语句
!确保文件路径正确
awk有许多内置变量设置环境信息。这些变量可以被改变。下面是一些常用的内置变量。

ARGC         命令行参数个数
ARGV         命令行参数排列
EVVIRON      支持队列中系统环境变量的使用
FILENAME     awk浏览的文件名
FNR          浏览文件的记录数
FS           设置输入域分隔符,等价于命令行-F选项
NF           浏览记录的域个数
NR           已读的记录数
OFS          输出域分隔符
ORS          输出记录分隔符
RS           控制记录分隔符
例:
$ awk 'END {print NR}' testfile3
$ awk '{print NF} END {print FILENAME}' testfile
3
3
3
testfile

沒有留言:

張貼留言