![2e3e2caa3235b36c5d1156d764117818.png](https://img-blog.csdnimg.cn/img_convert/2e3e2caa3235b36c5d1156d764117818.png)
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
使用方法:
awk '{pattern+action}' {filenames}
三种方式调用awk:
1,awk [-F field-separator] 'commands' input-file(s)
2,shell脚步方式
3,将所有的awk命令插入一个单独文件,然后调用
awk 内置变量:
ARCC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk 浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
RS 控制记录分割符
FOR EXAMPLE:
输出方法printf:
awk -F ':' '{printf("filename:%10s, linenumber:%s,columns:%s, linecontent:%sn",
FILENAME,NR,NF,$0)}' /etc/passwd
统计文件夹下文件的大小:
ls -l |awk 'BEGIN {size=0;} {size=size+$5;}
END{print "[end]size is ", size/1024/1024,"M"}'
条件语句:
awk中的条件语句是从C语言中借鉴来的
循环语句:
awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,
这些关键字的语义和C语言中的语义完全相同。
FOR EXAMPLE:
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;};
END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
高级用法:
1,指定多个分隔符:分隔符写成放到方括号中,如$awk -F'[ :/t]' '{print $1,$3}' test
2,awk的key的变态用户: awk '{a[$1,"/t", $2] += $4} END {for (uin in a) printf("%s/t%d/n", uin, a[uin]) }' test
3,awk的范围模版:awk '/root/,/MySQL/' test将显示root第一次出现到mysql第一次出现之间的所有行。
4,awk的重定向:awk 可使用shell的重定向符进行重定向输出,如:$ awk '$1 = 100 {print $1 > "output_file" }' test
#
5,获取数组的长度:awk 'BEGIN{info="it is a test";lens=split(info,tA," ");
print length(tA),lens,tA[1];}'
注意:数组下标是从1开始,与c数组不一样。
6,多维数组:awk提供了逻辑上模拟二维数组的访问方式,awk使用一个特殊的字符串
SUBSEP (034)作为分割字段,既是a[2,4]的键值为20344
#
7,两个文件行的关联:awk -F | 'NR==FNR{a[$1]=$0;next}
{print a[$1]"|"$2}' 文件1 文件2
8,显示最后一行:awk 'END{print $0}' file
9,显示最后一列:awk '{print $NF}' file
#
10,求最小值:awk '
{min=65535;
for(i=1;i<=NF;i++)
{min=($i<min)? $i:min};
print min
}' file