awk 參數 ‘模式{動作}’ 文件
awk 參數 ‘條件(找誰){幹啥}’ 文件
常用: -F 指定分隔符 取列,默認空格爲分隔符
awk正則表達式
符號 | 表達含義 |
---|---|
* | 與前面的正則表達式的零個或多個出現匹配 |
. | 匹配任何單個字符 |
\ | 轉義隨後的特殊字符 |
+ | 匹配前面的正則表達式的一次或多次出現 |
^ | 作爲正則表達式的第一個字符,表示匹配行的開始,以什麼開頭 |
$ | 作爲正則表達式的最後一個字符,表示匹配行的結尾 |
? | 匹配前面的正則表達式的零次或一次出現 |
{n,m} | 匹配它前面某個範圍內單個字符出現的次數,{n}將匹配n次出現,{n,}至少匹配n次出現,{n,m}匹配n和m之間的任意次出現 |
1.awk取行,匹配文件內容:
- awk -F":" '{print $1 " " $3}' /etc/passwd $1與$3之間手動添加空格分隔
- awk '/ljc/' file 顯示文件file中包含ljc的匹配行。
- awk '!/ljc/' file 顯示文件file中不包含ljc的匹配行。
- awk '/起始內容/,/終止內容/' file 取包含內容的區間行區間匹配
- awk '/halt|sync/' file 匹配halt或者sync的行
- awk 'NR>=5 && NR<=10' file 取5到10行,邏輯與
- awk -F: '$1~/mail/ || $3>1 {print }' /ljc 取$1或者mail或者$3>1的行,邏輯或
2.awk中的替換:
替換但不修改文件內容:
gsub(/目標/,"替換爲什麼",第幾列)
gsub(/目標/,"替換爲什麼") == gsub(/目標/,"替換爲什麼",$0)
例:
[root@ljc ~]# awk 'gsub(/halt/,"tihuang")' liangjc.txt
3.BEGIN{} 模塊計算
END{} 模塊awk讀取文件之後執行,先計算,最後END{}顯示結果
數組運算一些常用例子
例1:分析access.log中每個ip地址出現的次數
[root@ljc~]# awk '{h[$1]++}END{for(p in h) print p""h[p]}' access.log|sort -rnk2|head|column -t
58.220.223.62 12
112.64.171.98 14
114.83.184.139 122
例2:分析access.log中每個ip地址使用的流量總數
i=i+$10 === i+=$10
[root@ljc~]# awk '{h[$1]+=$10}END{for(p in h) print p,h[p]/1024^2"MB"}' access.log |sort -rnk2|head |column -t
114.83.184.139 29.91MB
117.136.66.10 21.3922MB
116.216.30.47 20.4716MB
例3:分析secure文件中每個用戶被破解的次數:
破解root用戶的次數
[root@ljc~]# awk '/Failedpassword/{if($(NF-5)=="root")i++}END{print i}' secure-20181219
3283
例4:分析secure文件中每個ip地址破解你的次數
[root@ljc ~]# awk '/Failedpassword/{h[$(NF-3)]++}END{for(p in h) print p" "h[p]}' secure-20181219|sort-rnk2|column -t|head
218.65.30.25 68652
218.65.30.53 34326
例5:分析secure文件中每個用戶被每個ip破解的次數
[root@ljc ~]# awk '/Failedpassword/{h[$(NF-5)" "$(NF-3)]++}END{for(p in h) print p""h[p]}' secure-20181219|sort -rnk3|column -t|head -20
root 218.65.30.25 68652
root 218.65.30.53 34326
root 218.87.109.154 21201
例6:分析access.log文件中每個ip地址的訪問次數與每個ip地址使用的流量總數:
1)ip地址使用的流量總數
[root@ljc ~]# awk '{h[$1]++;h[$1]+=$10}END{for(p in h)print p" "h[p]/1024^2"MB"}' access.log|column -t|sort-rnk2|head
114.83.184.139 29.9119MB
117.136.66.10 21.3937MB
2)ip地址的訪問次數
[root@ljc ~]# awk '{h[$1]""h[$1]++;s[$1]+=$10}END{for(t in h) print t" "h[t]}' access.log|column-t|sort -rnk2|head
58.220.223.62 12049
112.64.171.98 10856
3)每個ip地址的訪問次數與每個ip地址使用的流量總數
[root@ljc ~]# awk '{h[$1]""h[$1]++;s[$1]+=$10}END{for(t in h) print t" "h[t]""s[t]/1024^2"MB"}' access.log|column -t|sort -rnk2|head
58.220.223.62 12049 12.0192MB
112.64.171.98 10856 14.5483MB