awk编程模型
调用方法
与sed类似。
awk 'awk语句' inputfile
awk -f 'awk命令文件' inputfile
./awk命令文件 inputfile
awk语句由 /pattern/action组成
awk '/^$/{print "this is a blank line."}' inputfile
记录和域
行为记录,行中用空格/tab隔开的部分为域。
awk用$符号定义域,$1表示第一个域。
awk '{print $1 $2 $3 $4}' inputfile
awk '{print $0}' inputfile #打印全部域
awk 'BEGIN{one=1;two=2}{print $(one+two)} inputfile #打印第1+2=3个域
awk用-F选项修改域分隔符
或者用FS环境变量修改分隔符
awk -F "\t" '{print $3;}' inputfile
awk 'BEGIN{FS="\t"}{print $3;}' inputfile
awk 'BEGIN{FS="\t+"}{print $3;}' inputfile
awk关系/bool运算符
运算符 | 意义 |
---|---|
> >= < <= | 大于 … … |
|| && ! | 逻辑运算 |
== != | 相等/不等 |
~ !~ | 匹配/不匹配 |
awk 'BEGIN{FS="\t"} $1~/root/' inputfile
awk 'BEGIN{FS=":"} if($3<$4 && $1>0) print $0;' inputfile
表达式
x=1
y="sss"
z="ddd" "dgb" #z="ddd dgb"
运算符 | 意义 |
---|---|
+-*/% | 加减乘除余 |
^或** | 乘方 |
++x和x++ | 自增 |
#!/bin/awk -f
BEGIN{FS=","}
{
total=$2+$3+$4+$5
avg=total/5
print $1,avg
}
系统变量
格式化输出
printf,语法与C语言类似。
awk BEGIN{FS=","}{printf("%d %s", $1, $3);} inputfile
awk BEGIN{FS=","}{printf("%10.3f %-12s", $1, $3);} inputfile #长度10位小数点3位/12位字符串左对齐不足补上空格
内置字符串函数
流程控制
if(a==b) print $1;
while()
do
while()
for(;;)
数组
awk中为关联数组
b[10.5]=6
for(a in b) print b[a];
if("10.5" in b) print b[10.5];
split函数
split("aa/bb/cc", arr, "/"); #将aa/bb/cc以/为分隔符,分割到数组arr中
split($1, arr, " ");
BEGIN{
for(x=0;x<ARGC;x++)
print ARGV[x]
}