Linux - awk 文本处理工具五

时间:2024-05-14 00:05:38

awk 线上处理常用模式

awk 处理复杂日志

6.19:
DHB_014_号百总机服务业务日报:广州 到达数异常!
DHB_023_号百漏话提醒日报:珠海 到达数异常!
6.20:
DHB_014_号百总机服务业务日报:广州 到达数异常!到 awk -F '[_ :]+' 'NF>2{print $4,$1"_"$2,b |"sort";next}{b=$1}'
# 当前行NF小于等于2 只针对{print $,$"_"$,b |"sort";next} 有效 即 6.19:行跳过此操作, {b=$} 仍然执行
# 当前行NF大于2 执行到 next 强制跳过本行,即跳过后面的 {b=$}
广州 DHB_014 6.19

一些线上分析处理

分析图片服务日志,把日志(每个图片访问次数*图片大小的总和)排行,也就是计算每个url的总访问大小
说明:本题生产环境应用:这个功能可以用于IDC网站流量带宽很高,然后通过分析服务器日志哪些元素占用流量过大,进而进行优化或裁剪该图片,压缩js等措施。
本题需要输出三个指标: 【被访问次数】 【访问次数*单个被访问文件大小】 【文件名(带URL)】
测试数据:

192.168.1.101 - - [08/Dec/2017:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299

awk '{array_num[$7]++;array_size[$7]+=$10}END{for(i in array_num) {print array_num[i]" "array_size[i]" "i}}'

一些网上练习题:

已知:

wang
cui
zhao
liu
liu
chang
li 通过第一个域找出字符长度为4的
当第二列值大于3时,创建空白文件,文件名为当前行第一个域$ (touch $)
将文档中 liu 字符串替换为 hong
求第二列的和
求第二列的平均值
求第二列中的最大值
将第一列过滤重复后,列出每一项,每一项的出现次数,每一项的大小总和

处理方式

、字符串长度
awk 'length($1)=="4"{print $1}'
、执行系统命令
awk '{if($2>3){system ("touch "$1)}}'
、gsub(/r/,"s",域) 在指定域(默认$)中用s替代r (sed 's///g')
awk '{gsub(/liu/,"hong",$1);print $0}' a.txt
、列求和
awk '{a+=$2}END{print a}'
、列求平均值
awk '{a+=$2}END{print a/NR}'
awk '{a+=$2;b++}END{print a,a/b}'
、列求最大值
awk 'BEGIN{a=0}{if($2>a) a=$2 }END{print a}'
、将第一列过滤重复列出每一项,每一项的出现次数,每一项的大小总和
awk '{a[$1]++;b[$1]+=$2}END{for(i in a){print i,a[i],b[i]}}'