awk基础概念
- 输入数据前例程BEGIN{}
- 主输入循环{}
- 读完所有文件的例程END{}
- 每行内容记录称为记录,英文名称 Record
- 每行通过分隔符分隔的每一列称为字段和英文名称 Field
在澄清了这些概念之后,我们将总结几个重要的内置变量: NR:表示当前行数; NF:表示当前列数; RS:行分隔符,默认为换行; FS:列分隔符,默认为空格和制表符; OFS:打印时用于分割字段的输出列分隔符默认为空格 ORS:打印时用于分割记录的输出行分隔符默认为换行符
awk实战
已经stat.txt的内容如下:
#输出第二列和第三列信息: awk '{print $2,$3}' stat.txt #输出第二列和第三列信息,不包括第一行 awk '{if(NR>1) print $2,$3}' stat.txt #统计每行数字总数: awk '{sum=0;for(i=3;i<=NF;i ) sum =$i;print sum}' stat.txt #统计每行总数,不包括第一行: #做法一: awk '{if(NR>1) {sum=0;for(i=3;i<=NF;i ) sum =$i;print sum} }' stat.txt #做法二: sed -n '2,$p' stat.txt | awk '{sum=0; for(i=3;i<=NF;i ) sum =$i;print sum}' #统计所有行加起来的总数,END是遍历所有行后执行的操作: awk '{for(i=3;i<=NF;i ) sum =$i} END {print sum}' stat.txt #将awk将句子写入文件中test1.awk,通过awk -f调用文件执行awk语句: sed -n '2,$p' stat.txt | awk -f test1.awk #awk数组运用 awk '{a[$2]=$NF} END {for(i in a) print i,a[i]}' stat.txt #其实上面这个只是打印第二列和最后一列,相当于 awk '{print $2,$NF}' stat.txt
awk进阶使用
##指定输出列的间隔符 awk 'BEGIN{OFS="||"} {print $2,$NF}' stat.txt #执行列的分隔符和输出后的间隔符 head -5 /etc/passwd | awk 'BEGIN{FS=":";OFS="||"} {print $1,$NF}'
#awk格式输出:printf ll -S | head -5 | awk '{printf("%.2f%s\n",$5/1024,"KB")}' #ll -S表示按文件大小倒序排序。 #%.2f说保留两位小数,%f默认保留6位小数。 #\n表示换行。