原创

awk内置变量和查数据常用例子

一、awk内置变量表

属性

说明

$0

当前记录(作为单个变量)

$1~$n

当前记录的第n个字段,字段间由FS分隔

FS

输入字段分隔符 默认是空格

NF

当前记录中的字段个数,就是有多少列

NR

已经读出的记录数,就是行号,从1开始

RS

输入的记录他隔符默 认为换行符

OFS

输出字段分隔符 默认也是空格

ORS

输出的记录分隔符,默认为换行符

ARGC

命令行参数个数

ARGV

命令行参数数组

FILENAME

当前输入文件的名字

IGNORECASE

如果为真,则进行忽略大小写的匹配

ARGIND

当前被处理文件的ARGV标志符

CONVFMT

数字转换格式 %.6g

ENVIRON

UNIX环境变量

ERRNO

UNIX系统错误消息

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<min) min=$1 fi} END {print "Min=", min}'

5.求区间

seq 60|awk '$0>20&&$0<25{print $0}'

6.END

awk -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.打印map

awk -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文件里面userIDa文件里面

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使用getline

a=/data/a
b=/data/b
result=/data/result
awk -F\| -v a=${a} -v b=${b} 'BEGIN{
while(getline<a>0){
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)}'





正文到此结束
本文目录