文章來源:王琦的個人博客-linux三劍客之awk ,互聯網打雜,喜歡多語言編程,記錄一些知識碎片,分享一些心得。
linux三劍客之awk,以字段爲單位進行處理數據的處理,統計。作爲開發人員也應熟練掌握
awk 命令參數
awk 參數 ‘模式{動作}’ 文件
1、-F "[ ]"
,以指定分隔符號分隔,也就是多個字段
2、print
打印輸出
3、$n
第n列
4、$0
表示一整行
5、NF
列的數量
6、$NF
最後1列名稱
# NF當前列總數
# 打印第一行列總數
awk 'NR==1{print NF}'
# $NF 表示最後1列的名稱,
awk '{print $NF}'
# -vOFS='\t' 輸出指定分割符
awk -vOFS="\t" '{NF=3}1'
# 打印1,3列
'{print $1,$3}' 顯示指定列
# 打印第1-10列
awk -vOFS='\t' '{NF=10}1'
查找
awk '/php/' file # 找出包含php的行
awk '/^$/{print NR}' file # 查找空行
awk '$2~/php/' file # 查找第二列包含php的行
awk '$3~/[15]$/{print $1}' file # 以1或5結尾
替換
# /目標/,"替換內容",(第幾列);print
awk '{gsub(/:/,"$",$4);print}' reg.txt
特殊模式BEGIN END
END{}會在讀取完文件的最後一行執行
# 統計空行數量
awk '/^$/{i++}END{print i}' file
awk數組
1、統計域名開頭出現的次數
https://www.hiwangqi.com
https://www.hiwangqi.com
https://post.hiwangqi.com/
https://mp3.hiwangqi.com/
https://post.hiwangqi.com/
awk -F "[/.]+" '{h[$2]++}END{print h["www"],h["post"]}' file
3 2
awk -F "[/.]+" '{h[$2]++}END{for(pol in h) print pol,h[pol] }' file
www 3
mp3 1
post 2
2、統計access.log中ip出現的次數並排序
awk '{f[$1]++}END{for(ip in f) print ip,f[ip]|"sort -nk2"}' ./access.log
sort
-n
:按數值大小進行排序。
-k
:按第幾列進行排序。
-r
:逆序。
3、統計出secure文件中每個用戶和每個ipfailed錯誤的次數
# 內容:
# Failed password for invalid user mashby from 120.52.120.166 port 47904 ssh2
awk '/Failed/{print $(NF-5), $(NF-3)}' /var/log/secure |sort|uniq -c|sort -n
# 顯示結果:
208 root 43.225.180.227
310 root 115.239.253.159
633 root 210.245.107.92
命令解釋:
$(NF-5)
:$NF表示最後一列,$(NF-3)則表示IP
srot
:默認以ASCII 碼的次序排列,先進行排列,所有相同的行就會出現在相連的地方。
uniq -c
:uniq用於去除相鄰位置的行例如。-c參數則用於在每列旁邊顯示該行重複出現的次數。
# sort前
aaaaaaa
ccccccc
aaaaaaa
# sort後
aaaaaaa
aaaaaaa
ccccccc
# uniq之後
aaaaaaa
bbbbbbb