淺談awk
awk,文本處理三劍客之一,它的名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母,它不僅是 linux中也是任何環境中現有的功能最強大的數據處理引擎之一。作為一種強大的語言,它具備了一個完整的語言所應具有的幾乎所有精美特性。
基本格式:awk [options] ‘program‘ file…
program:pattern{action statements;..}
pattern和action:
pattern部分決定動作語句何時觸發及觸發事件
BEGIN,END
action statements對數據進行處理,放在{}內指明
print, printf
工作原理
第一步:執行BEGIN{action;… }語句塊中的語句
第二步:從文件或標準輸入(stdin)讀取一行,然後執行pattern{ action;… }語句塊,它逐行掃描文件,從第一行到最後一行重復這 個過程,直到文件全部被讀取完畢。
第三步:當讀至輸入流末尾時,執行END{action;…}語句塊
BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個 可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常 可以寫在BEGIN語句塊中
END語句塊在awk從輸入流中讀取完所有的行之後即被執行,比如 打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它 也是一個可選語句塊
pattern語句塊中的通用命令是最重要的部分,也是可選的。如果 沒有提供pattern語句塊,則默認執行{ print },即打印每一個讀取 到的行,awk讀取的每一行都會執行該語句塊
常用變量和操作符 $0 表示整個當前行 $1 每行第一個字段 NF 字段數量變量 NR 每行的記錄號,多文件記錄遞增 FNR 與NR類似,不過多文件記錄不遞增,每個文件都從1開始 FS BEGIN時定義分隔符 RS 輸入的記錄分隔符, 默認為換行符(即文本是按一行一行輸入)awk ‘/^UUID/{fs[$3]++}END{for(i in fs){print i,fs[i]}}‘ /etc/fstab
補充:
/^UUID/:模式匹配以UUID開頭的行
fs[$3]++:定義fs[]為關聯數組下標是每條記錄的第3個字段,數組的值是出現的次數
for(i in fs){print i,fs[i]}:在每條記錄都處理完後,用for循環遍歷數組,打印下標(文件類型)和數組元素值(文件類型出現的次數)
2、統計/etc/fstab文件中每個單詞出現的次數
awk ‘{i=1;while(i<=NF){word[$i]++;i++}}END{for(num in word){print num,word[num]}}‘ /etc/fstab
補充:
用while循環處理每條記錄的每個字段,最主要的是每處理完一個字段要把i置為—,這樣每處理完一個記錄,關聯數組被下一個記錄的每個字段重新賦值
3、提取出字符串[email protected]%9&Bdh7dq+yVixp3vpw中的所有數字
echo "[email protected]%9&Bdh7dq+yVixp3vpw" | awk ‘gsub(/[^[:digit:]]/," ",$0)‘
補充:
gsub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,並全部替換為s所表示的內容,模式匹配用的是擴展正則表達式
4、解決DOS攻擊生產案例:根據web日誌或者網絡連接數,監控當某個IP並發連接數或者短時間內PV達到100,即調用防火墻命令封掉對應的IP,監控頻率每隔5分鐘。防火墻命令為:iptables -A INPUT -s IP -j REJECT
awk ‘{access[$1]++}END{for(i in access){if(access[i]>=100){print i,access[i]}}}‘ access_log
補充:
監控任務可以寫到計劃任務裏,這裏只使用awk實現過濾(access_log為apache訪問日誌)
謝謝瀏覽,多多評論哦。
淺談awk