awk一些常用基本方法詳解

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章