awk备忘录

awk  简介
整体来说, a w k是所有s h e l l过滤工具中最难掌握的,不知道为什么,也许是其复杂的语法或含义不明确的错误提示信息。在学习a w k语言过程中,就会慢慢掌握诸如Bailing out 和a w k : c m d . L i n e :等错误信息。
可以说a w k是一种自解释的编程语言,之所以要在s h e l l中使用a w k是因为a w k本身是学习的好例子,但结合a w k与其他工具诸如g r e p和s e d,将会使s h e l l编程更加容易。
awk是必须熟练掌握的命令之一。
awk 调用方式
有三种方式调用a w k,第一种是命令行方式,如:
 awk [-F field-seperator] ‘commands’ input-file(s)
 这里,c o m m a n d s是真正的a w k命令。一般使用这种调用方法。
第二种方法是将所有a w k命令插入一个文件,并使a w k程序可执行,然后用a w k命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的a w k命令插入一个单独文件,然后调用:

awk 域和记录

示例文件:
$ cat bill.vc
0 system_type 0 1 2 0 * * * 业务类型
1 msisdn  2  16 0 * * * 手机号码
2 other_party 17 40 0 * * * 对端号码
3 start_datetime 41 53 0 * * * 通话时间 
a w k执行时,其浏览域标记为$ 1,$ 2 . . . $ n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。awk使用-F选项来指定域分割符,如-F “|”,表示以|作为分割符,默认分隔符为空格。上例中的,第一列就是$1,第二列是$2,$0表示整行记录。
范例
 awk ‘{print $1,$3}’ bill.vc
 awk ‘{print $0}’ *.vc
 
awk 条件操作符

操作符描述操作符描述
 < 小于
 > = 大于等于
 < = 小于等于
 ~ 匹配正则表达式
 = = 等于
 !~ 不匹配正则表达式
 != 不等于


awk 语句举例

awk ‘{if($2~/msisdn/) print $0}’ bill.vc
 对于bill.vc文件,如果第2个域含有msisdn则输出整行记录。
awk ‘{if($1<=1) printf(“%-20.20s:%d\n”,$2,$4);}’ bill.vc
 如果第一个字段的值小于或等于1,则格式化输出第2和第4个域
awk ‘BEGIN{total=0;}{if($1>0) total+=$4}END{print “total=“total}’ bill.vc
 说明:
  BEGIN:在遍历整个文件之前,将total置为0
  第二部分的{}是一条if语句,符合条件则修改total的值
  END:在遍历完整个文件之后,输出total的值。注意这里引号括起来表示为常量字符串.

awk 内置变量

FS 域分隔符
NF 域数
NR 记录数
FILENAME 输入的文件名
OFS 输出域分隔符

awk 内置函数

s p l i t ( s , a , f s ) 在f s上将s分成序列a
 echo “a,b,c”|awk ‘{split($0,destArry,’,’);print destArry[1], destArry[2], destArry[3]}’
l e n g t h ( s ) 返回s长度
 echo “a,b,c”|awk ‘{print length($0)}’
i n d e x ( s , t ) 返回s中字符串t的第一位置
 echo “a,b,c”|awk ‘{print index($0,”,”)}’
s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分
 echo “a,b,c”|awk ‘{print substr($0,3)}’
s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分
 echo “a,b,c”|awk ‘{print substr($0,3,1)}’

猜你喜欢

转载自zotao.iteye.com/blog/983293