天天看點

Linux - awk 文本處理工具五

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 $4,$1"_"$2,b |"sort";next} 有效 即 6.19:行跳過此操作,  {b=$1} 仍然執行
# 目前行NF大于2 執行到 next 強制跳過本行,即跳過後面的 {b=$1}
廣州 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     4
cui      3
zhao     4
liu      3
liu      3
chang    5
li       2

1 通過第一個域找出字元長度為4的
2 當第二列值大于3時,建立空白檔案,檔案名為目前行第一個域$1 (touch $1)
3 将文檔中 liu 字元串替換為 hong
4 求第二列的和
5 求第二列的平均值
6 求第二列中的最大值
7 将第一列過濾重複後,列出每一項,每一項的出現次數,每一項的大小總和      

處理方式

1、字元串長度
awk 'length($1)=="4"{print $1}'
2、執行系統指令
awk '{if($2>3){system ("touch "$1)}}'
3、gsub(/r/,"s",域) 在指定域(預設$0)中用s替代r  (sed 's///g')
 awk '{gsub(/liu/,"hong",$1);print $0}' a.txt
4、列求和
 awk '{a+=$2}END{print a}'
5、列求平均值
 awk '{a+=$2}END{print a/NR}'
 awk '{a+=$2;b++}END{print a,a/b}' 
6、列求最大值
awk 'BEGIN{a=0}{if($2>a) a=$2 }END{print a}'
7、将第一列過濾重複列出每一項,每一項的出現次數,每一項的大小總和
awk '{a[$1]++;b[$1]+=$2}END{for(i in a){print i,a[i],b[i]}}'      

轉載于:https://www.cnblogs.com/sharesdk/p/8696565.html

繼續閱讀