• awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
如何执行awk
• 在LINUX的命令行上键入诸如下列格式的指令: ( “$”表Shell命令行上
的提示符号)
$awk ‘awk程序’ 数据文件文件名
• 则awk会先编译该程序, 然后执行该程序来处理所指定的数据文件.
• (上列方式系直接把程序写在LINUX的命令行上)
• awk 程序的主要结构:
• awk程序中主要语法是 Pattern { Actions}, 故常见之awk 程序其型态
如下 :
• Pattern1 { Actions1 }
• Pattern2 { Actions2 }
• ......
• Pattern3 { Actions3 }
Pattern 是什么 ?
• awk 可接受许多不同型态的 Pattern. 一般常使用 “关系表达式”(Relational expression) 来当成 Pattern.
关系运算符(Relational Operators)
• >, <, >=, <=, ==, !=
• ~ (match) 及 !~(not match)
例如
• X > 10,X==Y
• “banana” ~ /an/
Actions 是什么?
• Actions 是由许多awk指令构成. 而awk的指令与 C 语言中的指令十分类似.
例如 :
• awk的 I/O指令 : print, printf( ), getline…
• awk的 流程控制指令 : if(…){..} else{..}, while(…){…}…
awk 如何处理 Pattern { Actions } ?
• awk 会先判断(Evaluate) 该 Pattern 的值, 若 Pattern 判断后的值为true (或不
为0的数字,或不是空的字符串), 则 awk将执行该 Pattern 所对应的 Actions.反
之, 若 Pattern 之值不为 true, 则awk将不执行该 Pattern所对应的 Actions.
例如 : 若awk程序中有下列两指令
• 50 > 23 {print “Hello! The word!!” }
• “banana” ~ /123/ { print “Good morning !” }
• awk会先判断 50 >23 是否成立. 因为该式成立, 所以awk将印出”Hello! The
word!!”. 而另一 Pattern 为 “banana” ~/123/, 因为”banana” 内未含有任何子字
符串可 match /123/, 该 Pattern 之值为false, 故awk将不会印出”Good
morning !”
• awk 的字段变量
• awk 所内建的字段变量及其含义如下 :
• awk 的内建变量(Built-in Variables)
• awk 提供了许多内建变量, 使用者于程序中可使用这些变量来取得相
关信息.常见的内建变量有 :
例如:awk 从文件 data.csv 中读入第一笔数据行
• 100012 小明0 xiaoming0 1234567890 11111111111111110 杭州 0 0
• 读取之后,程序中,
• $0 之值将是
• $1 之值为
• $2 之值为
• $3 之值为
• $4 之值为
• $NF 之值为 8
• $NR 之值为 1
• $FILENAME 之值为
Awk工作流程
执行awk时, 它会反复进行下列四步骤:
1、自动从指定的数据文件中读取一个数据行.
2、自动更新(Update)相关的内建变量之值. 如 : NF, NR,
$0...
3、依次执行程序中 所有 的 Pattern { Actions } 指令.
4、当执行完程序中所有 Pattern { Actions } 时, 若数据文件
中还有未读取的数据, 则反复执行步骤1到步骤4.
awk会自动重复进行上述4个步骤, 使用者不须于程序中编
写这个循环 (Loop).
Awk字段变量使用
• awk -F\, '{print $1}' data.csv
• awk -F\, '{print $1,$2}' data.csv
• awk -F\, '{print $1" "$2}' data.csv
• awk -F\, ‘/99999/{print $0}’ data.csv等同于awk -F\, '$0~/99999/{print $0}'
data.csv
• awk -F\, '$1 ~ /999/{print $0}' data.csv
• awk -F\, '$1 !~ /999/{print $0}' data.csv
• 检索java进程PID
• ps -ef | grep java | grep -v grep |awk '{print $2}'
Awk内建变量使用
FS #改变字段切割的方式
awk 'BEGIN{FS="[,]";print "begin read file........"}{print $1,$2}END{print
"file read done"}' data.csv
BEGIN和END只执行一次
NR # awk已读入的数据行数目
NF #文件列总数
awk 'BEGIN{FS="[,]";print "begin read file........"}NR>99990{print
NR,NF,$1,$2}END{print "file read done"}' data.csv
Awk赋值、运算、比较
• 算术运算
• awk 'BEGIN{FS="[,]";print "begin read
file........";i=0}NR>99990{i+=1;print
NR,NF+i,$1,$2}END{print "file read done"}' data.csv
• i=0; 在BEGIN语句中赋值,初始化
• i+=1;运算操作,等同于i=i+1;
• NR>99990;比较运算
• awk 'BEGIN{FS="[,]";print "begin read
file........";i=0}NR>99990&&$1>=200006{i+=1;print
NR,NF+i,$1,$2}END{print "file read done"}' data.csv
• 比较运算符:&& || != 与/或/不等于
Awk条件判断
• If else
• awk 'BEGIN{FS="[,]";print "begin read
file........";i=0}{if(NR>99990||$1>=200006){i
+=1;print NR,NF+i,$1,$2} else {print
"NR<=99990||$1>=200006"}}END{print
"file read done"}' data.csv
Awk循环
• For循环
• awk '
• BEGIN{
• X[1]= 50; X[2]= 60; X["last"]= 70
• for( any in X )
• printf("X[%s] = %d\n", any, X[any] )
• }‘
• awk 'BEGIN{
for(k in ENVIRON)
{
print k"="ENVIRON[k];
}
}'
• While循环
• awk 'BEGIN{
total=0;
i=0;
do
{
total+=i;
i++;
}while(i<=100)
print total;
}'
• [root@tomcat099 sh]# cat data.dat
• 2000000001
2000000002
2000000003
2000000004
2000000005
2000000006
2000000007
2000000008
2000000009
• [root@tomcat099 sh]# sed '2,${s/^[0-9]/3/g}' data.dat
2000000001
3000000002
3000000003
3000000004
3000000005
3000000006
3000000007
3000000008
3000000009
• redis命中率:
• echo -ne "hits\tmiss\thit rate\n" >>aa.txt ;while true; do /usr/local/redis-
2.8.7/src/redis-cli info | awk -F':'
'/keyspace_hits/{hits=$2}/keyspace_misses/{printf "%5d %5d %.2f\n",
hits,$2,(hits/(hits+$2))*100}';sleep 2;done >> aa.txt