awk
awk 分组统计
文件aa.txt,格式为:
时间 url
2 url1
8 url3
2 url2
3 url1
4 url3
要求:在第二列url相同条件下,输出第一列最大值,第一列平均值,第二列出现相同url次数。
每行输出列格式为:第一列最大值、第一列平均值、第二列出现相同url次数、url
那么统计结果是:
8 6 2 url3
2 2 1 url2
3 2.5 2 url1
代码
平均值:awk '{a[$2]+=$1;b[$2]++}END{for(n in a)print a[n]/b[n]"\t"n}'
相同url访问次数:cat aa.txt |sort +1 -2 |uniq -f 1 -c |awk '{print $1 "\t" $3}'|sort -r -n
最长访问时间:awk '{max[$2]=max[$2]>$1?max[$2]:$1;number[$2]++;sum[$2]+=$1}END{for (i in max) print max[i], sum[i]/number[i],number[i],i}' OFS="\t" infile
awk打印回车
ll | awk -F\: '{printf $2 "\n"}'
awk 的分隔符转义
awk 的分隔符转义是使用两个反斜线或四个反斜线
例如要把values( ); , 作为分隔符如下:
awk -F 'values \\(|\\);|\\,'
awk单引号及换行符表示(转义输出)
awk 'BEGIN{printf "\047\012"}'
\047是单引号 \012是换行符
awk拼写sql语句示例:
tbdate="`date '+%Y%m'`"
grep ' # ' $ac|grep -v '60.247.21.114' |grep -v 'spider' |grep -v 'bot'|awk -F ' # ' '{print "insert into LOG'$tbdate'(LOGID,VISITIP,VISITTIME,REQ_URL,VISITSTATUS,VISITLL,VISITUA,MOBILEPHONE) values(seq_log'$tbdate'.nextval,\047"$1"\047,\047"$4"\047,\047"gsub("&"," ",$5)"\047,\047"$6"\047,\047"$7"\047,\047"gsub("&"," ",$9)"\047,\047"$10"\047);"}' >> totalinfo.sql
awk 判断命令是否执行成功
awk 'BEGIN{ret=1} {if($0=="success" || $0=="success\n") {ret=0}} END{exit ret}'
awk 使用shell变量
awk -v time="${Time}" '{if($1>time) print $2}'