在linux系統上有三大文本處理工具分别是:grep,sed,awk,這次主要來看看awk。
awk option ‘pattern' file
-F 指定分隔符;
-v 申明自定義變量;
檢視目前系統上,使用者名和使用者shell,輸出分隔符為~.
# awk -F: 'BEGIN{OFS="~";print "UserName Shell"}{print $1,$7}END{print "================end============="}' /etc/passwd
<a href="http://s3.51cto.com/wyfs02/M00/30/68/wKioL1OnkG2Te8bLAAHoqAr3-7g056.jpg" target="_blank"></a>
還可以在中間加入模式(pattern),指定隻對以in字元結尾的行做處理。
# awk -F: 'BEGIN{OFS="~";print "UserName Shell"}/in$/{print $1,$7}END{print "================end============="}' /etc/passwd
<a href="http://s3.51cto.com/wyfs02/M01/30/69/wKiom1OnkOzi04CKAAGVk9MVmA4087.jpg" target="_blank"></a>
顯示目前系統上id号小于等于500的使用者。(表達式比對)
# awk -F: '$3<=500{print $1,$3}' /etc/passwd
<a href="http://s3.51cto.com/wyfs02/M01/30/69/wKiom1OnkfTysUq8AADz8_EeYe4797.jpg" target="_blank"></a>
顯示目前系統上shell是/bin/bash的使用者(模式比對)
# awk -F: 'BEGIN{OFS=":";print "UserName Shell"}$7~/bash/{print $1,$7}' /etc/passwd
<a href="http://s3.51cto.com/wyfs02/M01/30/69/wKioL1Onl2bjz1u4AADhHFbpQSY508.jpg" target="_blank"></a>
控制語句:
判斷使用者ID是否為0,如果是就輸出使用者名并說明是一個管理者使用者,如果不是輸出使用者名,說明是一個普通使用者。
# awk -F: '{if ($3==0) {print $1,"Administrator";} else {print $1,"Common User"}}' /etc/passwd
<a href="http://s3.51cto.com/wyfs02/M01/30/6C/wKioL1OnxgKSOvcjAAFwjsNQKlA986.jpg" target="_blank"></a>
統計下系統上有多少個id号大于500的使用者
# awk -F: -v Sum=0 '{if ($3>=500) Sum++}END{print Sum}' /etc/passwd
<a href="http://s3.51cto.com/wyfs02/M02/30/6D/wKiom1OnyD6yBqjXAABze-oENBI068.jpg" target="_blank"></a>
顯示number.txt檔案中,是以大于100的數值。
# awk '{i=1;while (i<=NF) {if ($i>=100) print $i;i++}}' number.txt
<a href="http://s3.51cto.com/wyfs02/M02/30/72/wKioL1On2DPxRUTHAACNMVVAN1k595.jpg" target="_blank"></a>
do-while 至少執行一次循環體,不管條件滿足與否。
# awk -F: '{i=4;do {print $i;i--}while (i>4)}' /etc/passwd
周遊/etc/passwd $1-$3數值,隻輸出字元數大于4的資料。
# awk -F: '{for(i=1;i<=3;i++){if (length($i)>=4){print $i}}}' /etc/passwd
<a href="http://s3.51cto.com/wyfs02/M01/30/73/wKioL1On3VizB9Q_AACb890E34E218.jpg" target="_blank"></a>
使用for顯示number.txt檔案中,是以大于100的數值。
# awk '{for (i=1;i<=NF;i++){if ($i>=100) {print $i}}}' number.txt
檢視網絡連接配接各個狀态的次數
# netstat -tan | awk '/^tcp/{state[$NF]++}END{for ( S in state) print S,state[S]}'
<a href="http://s3.51cto.com/wyfs02/M01/30/75/wKioL1On5E_AS9BkAAG3w3BNjSI837.jpg" target="_blank"></a>
統計日志每個ip通路了多少次
# awk '{ip[$1]++}END{for ( A in ip ) print A,ip[A]}' access_log
統計目前系統使用者,每種shell各有多少個。
# awk -F: '{count[$NF]++}END{for (A in count )print A,count[A]}' /etc/passwd
<a href="http://s3.51cto.com/wyfs02/M00/30/76/wKioL1On57PwTWsFAAC6YdjgZnE778.jpg" target="_blank"></a>
awk的内置函數
split 将資料按分隔符切片儲存至數組裡
length 傳回字元串的字元個數
檢視目前每個IP連接配接,與連接配接次數。
# netstat -tan | awk '/:80/{split($5,client,":");IP[client[4]]++}END{for (A in IP) print A,IP[A]}'
<a href="http://s3.51cto.com/wyfs02/M01/30/7C/wKioL1On9P-w0vu2AAFuwWg7z2Y078.jpg" target="_blank"></a>
就是數組和split函數這裡難了
OK完成了
本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1429894