awk
awk是一个强大的文本分析工具。
相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
简单来说awk就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk -F ‘{pattern + action}’ {filenames}
支持自定义分隔符
支持正则表达式匹配
支持自定义变量,数组 a[1] a[tom] map(key)
支持内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
支持函数
print、split、substr、sub、gsub
支持流程控制语句,类C语言
if、while、do/while、for、break、continue
只是显示/etc/passwd的账户:CUT
awk -F’:’ ‘{print $1}’ passwd
只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行开始前添加列名name,shell,在最后一行添加"blue,/bin/nosh"(cut,sed)
awk -F’:’ ‘BEGIN{print “name,shell”} {print $1 “,” $7} END{print “blue,/bin/nosh”}’ passwd
搜索/etc/passwd有root关键字的所有行
awk ‘/root/ { print $0}’ passwd
统计/etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容
统计报表:合计每人1月工资,0:manager,1:worker
Tom 0 2012-12-11 car 3000
John 1 2013-01-13 bike 1000
vivi 1 2013-01-18 car 2800
Tom 0 2013-01-20 car 2500
John 1 2013-01-28 bike 3500
awk ‘{gsub(“0”,“manager”,$2);gsub(“1”,“worker”,$2);;split($3,month,"-");if(month[2]“01”){name[$1]+=$5}} END{for( i in name){print i “\t” name[i]}}’ awk.txt
awk '{
split($3,date,"-");
if(date[2]“01”){
name[$1]+=$5
}
}
END{
for(i in name){
print i “\t” name[i]}
}’ awk.txt
awk ‘{split($3,date,"-");if(date[2]“01”){name[$1]+=$5;if($2"0"){role[$1]=“M”}else{role[$1]=“W”}}} END{for(i in name){print i “\t” name[i]"\t" role[i]}}’ awk.txt
awk ‘{split($3,date,"-");
if(date[2]==“01”){
name[$1]+=$5
}
}
END{
for( i in name ){
print i"\t" name[i]
}
}’
awk.bb