一、awk内置变量表
属性说明
$0当前记录(作为单个变量)
$1~$n当前记录的第n个字段,字段间由FS分隔
FS输入字段分隔符默认是空格
NF当前记录中的字段个数,就是有多少列
NR已经读出的记录数,就是行号,从1开始
RS输入的记录他隔符默认为换行符
OFS输出字段分隔符默认也是空格
ORS输出的记录分隔符,默认为换行符
ARGC命令行参数个数
ARGV命令行参数数组
FILENAME当前输入文件的名字
IGNORECASE如果为真,则进行忽略大小写的匹配
ARGIND当前被处理文件的ARGV标志符
CONVFMT数字转换格式%.6g
ENVIRONUNIX环境变量
ERRNOUNIX系统错误消息
FIELDWIDTHS输入字段宽度的空白分隔字符串
FNR当前记录数
OFMT数字的输出格式%.6g
RSTART被匹配函数匹配的字符串首
RLENGTH被匹配函数匹配的字符串长度
SUBSEP\034
二、查数据常用
1.求和:awk -F\| '{total=$1+total;} END {print total;}' tmp.log
2.求平均awk -F\| '{sum+=$5} END {print "Average = ", sum/NR}' tmp.log
3.求最大值awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'
4.求最小值(min的初始值设置一个超大数即可)awk 'BEGIN {min = 1999999} {if ($1
5.求区间seq 60|awk '$0>20&&$0<25{print $0}'
6.ENDawk -F\# '{if($5=="USE")a++}END{print a}'
7.显示时间awk -F\| '{OFS="|";$2=strftime("%Y-%m-%d %H:%M:%S",$2/1000);print $0}'
8.从一天的数据里面查询某个小时的数据awk -F\| '{Hour=strftime("%H",substr($7,0,10));print Hour}'
awk -F\| '{Hour=strftime("%H",$1);if(Hour=="12")print $0}' Bill.log
awk -F\| '$2==666{Hour=strftime("%H",substr($7,0,10));if(Hour=="09")print $0}' |sort -t\| -k7 -n
9.打印mapawk -F: '{a[$1]++}END{for (i in a) print i"|"a[i]}' tmp.log
10.按某行排序cat UserBill_35080|sort -t\| -k3 -nr
cat UserBill_35080|sort -t\| -k3 -n
11.时间段while [[ $StatDay -le $EndDay ]]
do
StatDay=`date -d"+1 day $StatDay" +"%Y%m%d"`
get10093 ${StatDay}
done
12.求b文件里面userID在a文件里面awk -F\| 'NR==FNR{a[$3]=0;}NR>FNR{if($3 in a) print $0 }' a b
awk -F\| 'NR==FNR{a[$0]=0}NR>FNR{if($1 in a){b[$2]++}}END{for(i in b)print i,b[i]}' a b
13.按位数将时间戳转换为时间#!/bin/sh
Col=$1
awk -F\| -v Col=$Col -v OFS="|" '{a=strftime("%Y-%m-%d %H:%M:%S",$Col/1000); print a,$0}'
14.输出到文件里面awk -F\| 'OFS="|" {a[$4]=$5} END {for(i in a){if(a[i]>=10){print i,a[i]>"b"}else print i,a[i]>"c"}}' a.log
15.统计个数,按照多个分隔符分割-F "[#|]"
awk -F "[:.]" '{a[$3]++} END {for(i in a)print i"|"a[i]}' a
16.awk分隔函数split
cat ${tmp}|awk -F\| '{a[$4]=$9"|"$14"|"$16"|"$18} END {for(i in a){split(a[i],strs,"|");print i"|"strs[1]"|"strs[2]"|"strs[3]"|"strs[4]}}'
17.awk使用getlinea=/data/a
b=/data/b
result=/data/result
awk -F\| -v a=${a} -v b=${b} 'BEGIN{
while(getline0){
User[$1]=$2"_"$3
}
for(i in User){
split(i,strs,"_");
name=strs[1];
age=strs[2];
printf(%s %s %s\n",id,name,age);
}
}'>${result}
18.awk输出不使用科学计数法
1、awk在默认情况下会将较大的值打印科学计数值
如:echo |awk '{print 1806293*0.9}' 结果为 1.62566e+06
2、如果要获得完整的数值,可以使用printf,使用方法和C语言一致
如:echo |awk '{printf("%d %d\n",1806293*0.9,465456456)}'