awk命令详解+示例
一、AWK介紹
AWK, 數據過濾工具???(類似于grep,比grep強大),屬數據處理引擎,基于模式匹配檢查輸入文本,逐行處理并輸出。通常用在Shell腳本中,獲取指定的數據,單獨使用時,可對文本數據做統計
創造者:Aho、Weinberger、Kernighan
二、語法格式
1、格式
格式1:前置命令?|?awk?[選項]?‘條件{編輯指令}'
格式2:awk?[選項]?‘條件{編輯指令}'??文件...
????編輯指令如果包含多條語句時,可以用分號分隔,處理文本時,若未指定分隔符,則默認將空格、制表符等作為分隔符。print是最常見的指令。
2、選項
-F:指定分隔符,可省略(默認空格或Tab位)
-V:調用外部Shell變量??variable
[root@localhost ~]# cat a.sh #!/bin/bash # 提取密碼,awk通過-v調用i變量 user="root shsnc" for i in $user doawk -F: -v X=$i '$1==X{print X "---" $2}' /etc/shadow done [root@localhost ~]# bash a.sh root---$1$jnKwNDZu$VsBXP9FMOGDVQ6./lpJ851 shsnc---$6$NVUFK2rh$IcLw9/6ioKY5TO5dj3heiy3R1pUnh/lYkKYBMnn6rmw4QsKSHTiEWxQlKaT2EZaMVrugXVVpWN6quDkMoPcSg1awk的內置變量
| 變量 | 用途 | 示例 |
| FS | 保存或設置字段分隔符,如FS=”:” | |
| $n | 指定分隔的第n個字段,如$1、$3分別表示第1、第3列 | awk?-F:?'{print?"用戶名:"$1}'?/etc/passwd awk?-F?“:”?'{print?"第2列是:",$2}'?a.txt 輸出第1、7個字段#?awk?-F:?'{print?$1","$7}'?a.txt ???????????????#?awk?-F?":"?'{print?$1","$7}'?a.txt ??分隔符用:或/?#?awk?-F?[:/]?'{print?$1","$7}'?a.txt #?free?|awk??'/Mem/{print?$1,$2}' 輸出文件的第1、2列:free?|awk??'{print?$1,$2}' 查看root密碼:awk?-F:?'/root/{print?$2}'?/etc/shadow 輸出第1、3、12字段:uname?-a?|?awk?'{print?$1,$3,$12}'?????? |
| $0 | 當前讀入的整行文本內容 | |
| NF | 記錄當前處理行的字段個數(列數) | 輸出最后一列$NF:awk?'{print?“Last:”$NF}'?a.txt 輸出倒數第二列:awk?'{print?“Last:”$(NF-1)}'?a.txt |
| NR | 記錄當前已讀入行的數量(行數) | awk?'{print?NR}'?a.txt |
| FNR | 當前行在源文件中的行號 | awk?'{print?“第”FNR”行”,“有“NF”列”}'?a.txt?b.txt |
awk變量??
??244??awk??'{print?"hello"}'?/etc/passwd246??head?-1?/etc/passwd?247??head?-1?/etc/passwd??|?awk?'{print?"hello"}'248??head?-2?/etc/passwd??|?awk?'{print?"hello"}'250??head?-2?/etc/passwd??|?awk?'1==2{print?"hello"}'252??awk??'{print?$0?}'?a.txt254??awk??'{print?"$0"?}'?a.txt257??head?/etc/passwd?|?awk?-F?":"?'{print?$1}'258??head?/etc/passwd?|?awk?-F?":"?'{print?$1,$7}'259??head?/etc/passwd?|?awk?-F?":"?'{print?$1,"???"$7}'260??head?/etc/passwd?|?awk?-F?":"?'{print?$1,"\tab"$7}'262??head?/etc/passwd?|?awk?-F?":"?'{print?$1,"#"$7}'263??head?/etc/passwd?|?awk?-F?":"?'{print?NF}'265???awk?-F?":"?'{print?NF}'?a.txt268???awk?-F?":"?'NF==7{print?$0}'?a.txt271??awk?'{print?NR}'??a.txt??b.txt272??awk?'{print?FNR}'??a.txt??b.txt273??awk?'{print?FNR,$0}'??a.txt??b.txt274??awk?'FNR==2{print?FNR,$0}'??a.txt??b.txt275??awk?'FNR==2{print?$0}'??a.txt??b.txt+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
awk自定義變量
?1174??awk??'{name="jim";print?name}'?a.txt1175??awk??'{name="jim";print?$name}'?a.txt1177??awk??'{age=21;name="jim";print?name,age}'?a.txt ?1201??df?-h1202??df?-h?|?grep?/$1203??df?-h?|?grep?/$?|?awk?'{print?$2}'1204??df?-h?|?grep?/$?|?awk?'{print?$2}'?|?awk?-F?"G"?'{print?$1}' #?head?-3?/etc/passwd?|?awk??'BEGIN{FS=":";print?"name\tuid"}{print?$1,"\t"$3}END{print?"sum?lines?"NR}'+++++++++++++++++++++++++++++++++++++++++++++++++++++
##### 示例:查看本機ip、內存、剩余磁盤容量 ### #!/bin/bash clear echo?"本地IP地址為:" ifconfig?eth0?|awk?'/inet/{print?$2}' echo?"本機剩余內存:" free?|awk?'/Mem/{print?$4}' echo?"本機剩余磁盤容量:" df?|awk?'/\/$/{print?$4}'???????????#找以/結尾的行#?tailf?/var/log/secure????回車到屏幕為空白為止
再開一個虛擬機窗口:ssh?ip?,輸入錯誤密碼
將/var/log/secure中所有密碼失敗的記錄IP提取出來
#awk?'/Failed/{print?"攻擊者是:",$11}'?secure
#?awk?'/Failed/{print?$11}'?/var/log/secure?|sort?|uniq?-c
#?awk?'/Failed/{print?$11}'?/var/log/secure?>>ip.log?放到周期性計劃中
或放到循環中,將輸入錯誤密碼的用戶設置防火墻或黑名單
#?uptime?|awk?'{print?$1,$10}'????查看cpu使用率
awk可以打印常量:awk?‘{print?“Hello?Wrold”}’?a.txt??//打印的內容與文件無關
{print?“Hello\tWrold\n”}???\t為一個Tab鍵????\n為換行
Awk可以混合打印常量及變量:awk?‘{print?“第“NR”行”“有“NF”列”}’?文件
#?awk?-F:?'{print?"第"NR"行""有"NF"列"}'?/etc/passwd
三、AWK過濾的時機
awk?選項?‘條件{命令}’?文件?---》
awk??[選項]??'?BEGIN{編輯指令?}?{編輯指令}?END{編輯指令}'??文件
??在所有行前處理,BEGIN{}
讀入第一行文本之前執行(執行1次),一般用來初始化操作
??逐行處理,{}
逐行讀入文本執行相應的處理(1行執行1次),是最常見的編輯指令塊
??在所有行后處理,END{}
處理完最后一行文本之后執行(執行1次),一般用來輸出處理結果
????三者可單獨使用,也可同時使用。?所有命令都要寫在{}里
#?awk?'BEGIN{print?"你好"}'
列出用戶名:?#?awk?-F:?'BEGIN{print?"用戶名:"}?/bash/{print?$1}'??passwd?
輸出預處理及處理完時的行數?#?awk?'BEGIN{print?NR}?END{print?NR}'?a.txt?
awk??'BEGIN{print?"hello"}{print?"a"}'??a.txt
awk??'BEGIN{print?"hello"}{print?"a"}END{print?"over"}'??a.txt
提取IP地址:#?ifconfig?eth0?|awk?-F:?'/inet/{print?$1}'?|awk?'{print?$2}'#?ifconfig?eth0?|?grep?"inet"?|?awk?'{print?$2}' 子網掩碼:#?ifconfig?eth0?|awk?-F"[?:]"?'/inet/{print?$13}' 提取根分區使用率:#?df?-hT?/?|?tail?-1?|?awk?'{print?$6}'列出a.txt有多少本書:
#?awk?'BEGIN{print?"\t圖書:"}?{print?$0}?END{print?"有"NR"本"}'?a.txt
統計使用bash的用戶個數:
#awk?'BEGIN{x=0}?/bash$/{x++}?END{print?x}'?/etc/passwd??
打印/etc/passwd的用戶名,uid,家目錄:
#?awk?-F:?'BEGIN{print?"用戶\tUID\t家"}{print?$1"\t"?$3"\t"?$NF}END{print?"總計有"??NR??"行"}'?/etc/passwd???????##?“\t”顯示Tab制表位
AWK處理條件
所有行全部處理并輸出嗎?
怎么限制處理的條件?
根據多個條件來處理指定的行?
條件的表達形式???-正則表達式;數值/字符串比較;邏輯比較;運算符
awk?'[條件]?{編輯指令}'??文件...
1.沒有條件,默認打印:#?awk?'/root/'??/etc/passwd??
????????與#?grep?"root"?/etc/passwd?結果相同
1.正則表達式
/正則/ 匹配正則(行)????#?awk?-F:?'/root/'??/etc/passwd
?????????????????????????#?awk?-F:?'/bash$/{print}'?a.txt??以bash結尾的完整記錄
~/正則/ 匹配正則(列)????#?awk?-F:?'$1~/root/'??/etc/passwd
!~/正則/ 不匹配
#awk?-F:?'/^ro/{print}'?/etc/passwd?????列出以ro開頭的用戶記錄
#?awk?-F:?'/^[a-d]/{print?$1,$6}'?/etc/passwd??輸出以a-d開頭的用戶名、宿主目錄
輸出其中用戶名以a開頭、登錄Shell以nologin結尾的用戶名、登錄Shell
#?awk?-F:?'/^a|nologin$/{print?$1,$7}'?/etc/passwd
輸出其中宿主目錄以bin結尾(對第6個字段做~匹配)的用戶名、宿主目錄信息:
#?awk?-F:?'$6~/bin$/{print?$1,$6}'?/etc/passwd
輸出其中登錄Shell不以nologin結尾(對第7個字段做!~反向匹配)的用戶名、登錄Shell信息:#awk?-F:?'$7!~/nologin$/{print?$1,$7}'?/etc/passwd
2.字符或數字比較
比較符號:?==?!=?>=?<=?<?>
#awk?-F:?‘NR==2{print}’a.txt??????輸出第2行文本
#awk?-F:?‘NR%2==1{print}’?a.txt????輸出奇數行(行號NR除以2余數為1)文本
#?awk?-F:?'NR%2==0{print}'?passwd.txt?輸出偶數行(行號NR除以2余數為0)文本
#awk?‘$2!=”XX”{print}’a.txt??輸出第2列不是XX的行
#?awk?-F:?'NR<=3{print}'?a.txt????輸出前3行文本
#?awk?-F:?'NR>=5{print}'?a.txt????輸出從第5行開始到文件末尾的所有行
輸出當前用戶的用戶名、宿主目錄、登錄Shell信息:
#?awk?-F:?'$1==ENVIRON["USER"]{print?$1,$6,$7}'?/etc/passwd
#awk?-F:?'$1=="root"{print}'?/etc/passwd??輸出用戶名為root的行
#?awk?-F:?'$3>1000'?/etc/passwd??打印uid大于1000的用戶
#?awk?-F:?'$3==1000'?/etc/passwd
#awk?-F:?'$3>=500{print?$1,$3}'?/etc/passwd
邏輯比較?????
邏輯與&&:期望多個條件都成立???
邏輯或||:只要有一個條件成立即滿足要求
#awk?-F:?'$3>=0&&$3<2{print?$1,$3}'?/etc/passwd??列出UID小于2的用戶信息
#awk?-F:?'$3>=1&&$3<=100{print?$1,$3}'?/etc/passwd?列出UID在(1-100)的用戶信息
#awk?-F:?'$1=="root"||$3>500'?/etc/passwd
#awk?-F:?‘$3==1||$3==7{print?$1,$3}’?/etc/passwd??列出UID為1或7的用戶信息
輸出第3~5行文本:#?awk?-F:?'NR>=3&&NR<=5{print}'?a.txt
???????????????#?awk?-F:?'(NR>=3)&&(NR<=5){print}'?a.txt
輸出第3行和第5行文本:#?awk?-F:?'NR==3||NR==5{print}'?a.txt
輸出“登錄Shell不以nologin結尾”或者“用戶名以a或d開頭”的文本:
#?awk?-F:?'$7!~/nologin$/||$1~/^[ad]/{print}'?a.txt
輸出UID小于3或者UID是偶數的用戶記錄:
#?awk?-F:?'$3<3||$3%2==0{print}'?/etc/passwd
4.運算符(與數學運算符一致)
+??-???*???/????%???????++?????--????????+=???-=??*=??/=???%=
不需要數據文件的預處理:#?awk?'BEGIN{a=12;b=13;print?a+b}'
????????????????????????#?awk?'BEGIN{a=1.2;b=13;print?a*b}'
????????????????????????#?awk?'BEGIN{a=1.2;print?a*b}'??//未定義變量為空
????????????????????????#?awk?'BEGIN{x=3;x++;print?x}'
輸出系統內建用戶的個數
awk?'BEGIN{i=0;FS=":"}$3<1000{i++}END{print?"內建用戶的個數是"?i}'??/etc/passwd
輸出系統外建用戶的個數
awk?'BEGIN{i=0;FS=":"}$3>=1000{i++}END{print?"外建用戶的個數是"?i}'??/etc/passwd
輸出系統總用戶的個數
awk???'BEGIN{i=0;FS=":"}{i++}END{print??"總用戶的個數是?"?i}'??/etc/passwd
輸出不能夠登陸用戶的個數
awk???'BEGIN{i=0;FS=":"}$7=="/sbin/nologin"{i++}END{print??"no?login?用戶的個數是??"?i}'??/etc/passwd
統計系統中使用bash作為登錄Shell的用戶總個數:預處理時賦值變量x=0,然后逐行讀入/etc/passwd文件檢查,如果發現登錄Shell是/bin/bash則x增加1,全部處理完畢后,輸出x的值即可:#?awk?'/bash$/{x++}?END{print?x}'?/etc/passwd
????????????????#?awk?'BEGIN{x=0}/\<bash$/{x++}?END{print?x}'?/etc/passwd
???????????????效果與egrep?-c?'\<bash$'?/etc/passwd?相同
統計本機中普通用戶的個數:#?awk?-F:?'$3>=1000{x++}?END{print?x}'?/etc/passwd
統計本機中系統用戶的個數:#?awk?-F:?'$3<1000{x++}?END{print?x}'?/etc/passwd
在實際工作中,利用awk的這種處理流程可以完成許多更復雜的任務。
綜計文件中以“:”分隔的總字段個數:(需要每處理一行時將當前行的字段數(內置變量NF)計和,因此可在BEGIN時定義一個初始變量,過程稱求和,最后在END時輸出結果)
#?awk?-F:?'BEGIN{x=0}?{x+=NF}?END{print?"Total?"x"?fields."}'?/etc/passwd
統計文本的總字段個數?#awk?‘BEGIN{i=0}{i+=NF}END{print?i}’?a.txt?
綜合運用:
列出UID間于501~505的用戶詳細信息:
#?awk?-F:?'$3>=501&&$3<=505{print}'?/etc/passwd
輸出/etc/hosts映射文件內以127或者192開頭的記錄:
#?awk?-F:?'/^127|^192/{print}'?/etc/hosts
列出100以內整數中7的倍數或是含7的數:
此操作無處理文件,正常思路應該是用Shell循環來完成;因為要求用awk來實現,如果不用循環,則根據逐行處理的思路,應該提供一個100行的文本對象(seq?100生成1-100的整數序列),然后將行號作為處理的整數,逐個判斷并輸出即可。
本任務中,行號與每行的實際文本值是一致的,那么根據NR或者$0行值進行判斷都是可以的。輸出100以內7的倍數或是包含7的數:
#?seq?100?|?awk?'NR%7==0||NR~/7/{print}'或:?#?seq?100?|?awk?'$0%7==0||$0~/7/{print}'
{print}可以省略,省略代表默認打印?#?seq?100?|?awk?'$1%7==0||$1~/7/'
計算在200以內,能同時被3和13整除的整數個數:
#?seq?200?|awk?'BEGIN{i=0}($0%3==0)&&($0%13==0){i++}END{print?i}'
輸出偶數行文本:
#?awk??'BEGIN{i=0}FNR%2==0{print?FNR,$0;i++}END{print?"偶數行是"?i?"lines"}'?a.txt
輸出/etc/hosts映射文件內以127或者192開頭的記錄:
#?awk?'/^(127|192)/'?/etc/hosts?
示例:把/etc/passwd中能登錄的用戶及其密碼(/etc/shadow)提取出來
找到使用bash作登錄Shell的本地用戶;列出這些用戶的shadow密碼記錄
按每行“用戶名?-->?密碼記錄”保存到getupwd.log
#/bin/bash
##?創建空文件
>?/tmp/getupwd.log
##?提取用戶名列表
NAME=`awk?-F:?'/:\/bin\/bash$/{print?$1}'?/etc/passwd`
##?通過for循環遍歷用戶名、查詢密碼記錄,保存結果
for?NAME?in?$NAME
do
????grep?"^$NAME:"?/etc/shadow?|?awk?-F:?'{print?$1"?-->?"$2?|?\
????"cat?>>?/tmp/getupwd.log"}'?/etc/shadow?????//模糊匹配
done
echo?"用戶分析完畢,請查閱文件?/tmp/getupwd.log"?##?完成后提示
#?chmod?+x?getupwd-awk.sh
驗證、測試腳本 #?./getupwd-awk.sh
或循環內采用命令://精確匹配
?awk?-F:?-v?x=$i?'$1==x{print?$1"---->?"$2?|"cat?>>/tmp/getupwd.log"}'?/etc/shadow
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
四、awk流程控制
if(){真}?else?if(){真}?else(){假}
分支結構?-?if
單分支:?if(條件){?編輯指令}
判斷系統用戶和普通用戶數量:
#?awk?-F:?'{??}?END{print?x,y}'?/etc/passwd?????##先寫好模板
if($3<1000){x++}else({y++}????????????????????##再寫好判斷
#?awk?-F:?'{??if($3<1000){x++}else{y++}??}?END{print?x,y}'??/etc/passwd
#awk??'BEGIN{FS=":"}{????if($3<=10){print?$0?;?i++}}END{print?i}'????/etc/passwd
#?awk??'BEGIN{FS=":"}FNR>=20&&FNR<=30{if($3<=10){print?$0?;?i++}}?END{print??"uid?<=10?is?"?i}'??/etc/passwd
統計/etc/passwd文件中UID小于或等于500的用戶個數:
#?awk?-F:?'BEGIN{i=0}{if($3<=500){i++}}END{print?i}'?/etc/passwd
統計/etc/passwd文件中UID大于500的用戶個數:
#?awk?-F:?'BEGIN{i=0}{if($3>500){i++}}END{print?i}'?/etc/passwd
統計/etc/passwd文件中登錄Shell是“/bin/bash”的用戶個數:
#?awk?-F:?'BEGIN{i=0}{if($7~/bash$/){i++}}END{print?i}'?/etc/passwd
統計/etc/passwd文件中登錄Shell不是“/bin/bash”的用戶個數:
#?awk?-F:?'BEGIN{i=0}{if($7!~/bash$/){i++}}END{print?i}'?/etc/passwd
雙分支:?if(條件){?編輯指令1}else{?編輯指令2}
#awk??-F?":"??'{???if($3<1000){?print?$1?}else{?print?$3,$1?}?}'??/etc/passwd
分別統計/etc/passwd文件中UID小于或等于500、UID大于500的用戶個數:
#?awk?-F:?'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print?i,j}'?/etc/passwd
分別統計/etc/passwd文件中登錄Shell是“/bin/bash”、?登錄Shell不是“/bin/bash”的用戶個數:
#?awk?-F:?'BEGIN{i=0;j=0}{if($7~/bash$/){i++}else{j++}}\
END{print?i,j}'?/etc/passwd
多分支:?if(條件){?編輯指令1}else?if(條件){?編輯指令2}....?else?if(條件){?編輯指令N-1}else{編輯指令N}
#awk??-F?":"??'{???if($7=="/bin/bash"){?print?$1?,"ok?login"?}else?if($7=="/sbin/nologin"){print?$1,"no?login"}?else{?print?$0?}???}'??/etc/passwd
分別統計/etc/passwd文件中登錄Shell是“/bin/bash”、“/sbin/nologin”、其他的用戶個數:#?awk?-F:?'BEGIN{i=0;j=0;k=0}{if($7~/bash$/){i++}\
else?if($7~/nologin$/){j++}else{k++}}END{print?i,j,k}'?/etc/passwd
循環結構?
while?(條件){循環體}?
for(賦初值;條件;步長){循環體}?
求詞頻:統計/etc/passwd文件內“root”出現的次數
——?分析:以“:”或“/”做分隔,針對每一行的每一列進行比對,如果包含“root”,則次數加1。其中,逐行處理直接由awk完成,逐列處理交給while循環,通過i變量依次取$1、$2、……、$NF進行檢查;變量j在預處理時賦值0,沒匹配一個字段加1。
#?awk?-F?[:/]?'BEGIN{j=0}{i=1}\
{while(i<=NF){if($i~/root/){j++};i++}}\
END{print?j}'??/etc/passwd
上一命令也可用另一條等效命令:
str=$(cat?/etc/passwd)
echo?$str?|awk?-F?“root”?‘{print?NF-1}’
實際應用時,上述操作可以簡單處理,可通過命令替換將文件內容賦值給一個變量(變為一行文本),然后針對此變量值以目標字符串“root”作為分隔,獲取總字段數-1即可得目標字符串的總數量:
#?echo?$(cat?/etc/passwd)?|?awk?-F?"root"?'{print?NF-1}'
日常運用:日志(誰,訪問什么)求頻率
輸出數字1-10:??#?awk??'BEGIN{?for(i=1;i<=10;i++){print?i}?}'
輸出數字1-10:??#awk??'BEGIN{??i=1??;?while(i<=?10){print??i;i++}???}'
運用:#awk??'BEGIN{??i=1??;?while(i<=?10){print??"172.40.56."i;i++}???}'
++++++++++++++++++++++++++++++++++++++++++++++++++++
其他控制語句
常用的中斷、退出等awk指令
| 關鍵字 | 含義 | 示例 |
| break | 結束當前的循環體 | |
| continue | 中止本次循環,轉入下一次循環 | |
| exit | 如果沒有END{}則直接退出awk處理操作 |
awk??'BEGIN{????for(i=10;i<=20;i++){?print?i?}???}?'
awk??'BEGIN{????for(i=10;i<=20;i++){?print?i?;break}???}?'
awk??'BEGIN{????for(i=10;i<=20;i++){break?;?print?i?}???}?'
awk??'BEGIN{????for(i=10;i<=20;i++){??if(i==17){break}?;?print?i??}???}?'
awk??'BEGIN{????for(i=10;i<=20;i++){?print?i?;?continue}???}?'
awk??'BEGIN{????for(i=10;i<=20;i++){??continue?;?print?i?}??}?'
awk??'BEGIN{????for(i=10;i<=20;i++){??if(i==16||i==19){continue}?;?print?i?}??}?'
awk??'FNR==7{exit}END{print?FNR}'?a.txt
awk??'{exit}END{print?FNR}'?a.txt
awk??'FNR==11{exit}{print?$0}'?/etc/passwd?
awk??'FNR<=10{print?$0}'?/etc/passwd?
awk??'FNR==11{exit}{print?$0}'?/etc/passwd?
awk??'{exit}{print?$0}'?/etc/passwd?
+++++++++++++++++++++++++++++++++++++++++++++++++++++
五、awk數組
定義數組:數組名[下標]=元素值
??????????數組名["下標"]="元素值"??????##下標不一定是數字,也可以是字符
使用數組:數組名[下標]
輸出數組元素的值:???print??數組名[下標]
#?awk??'BEGIN{teagrp[1]="plj";teagrp[2]="hpg";print?teagrp[2],teagrp[1]}'
??????//為數組teagrp賦值兩個元素,值分別為plj、hpg
#?awk??'BEGIN{stugrp["name"]="tom";stugrp["age"]=21;stugrp["sex"]="boy";print?stugrp["name"],stugrp["sex"],stugrp["age"]}'
++++++++++++++++++++++++++
主機1(設:192.168.4.10)
#yum?-y?install?httpd
#service?httpd?start
#tailf?/var/log/httpd/access_log
主機2:(關閉防火墻)
#curl?http://192.168.4.10
#?ab?-c?100?-n?10000?http://192.168.4.10/??
????????有100人,快速訪問服務器1萬次,ab中acheBench軟件的縮寫。DOS攻擊
主機1:?#wc?-l?/var/log/httpd/access_log
遍歷數組的專屬循環結構:for(變量名?in?數組名){print?數組名[變量名]}
+++++++++++++++++++++++++++++++++++++++++++++++++++++
示例:分析Web日志的訪問量排名,要求獲得客戶機的地址、訪問次數,并且按照訪問次數排名
在分析Web日志文件時,每條訪問記錄的第一列就是客戶機的IP地址,其中會有很多重復的IP地址。通過awk提取信息時,利用IP地址作為數組下標,每遇到一個重復值就將此數組元素遞增1,最終就獲得了這個IP地址出現的次數。
ip[1]++=1,(因為ip[1]未定義,所以為空值)
針對文本排序輸出可以采用sort命令,相關的常見選項為-r、-n、-k。其中-n表示按數字順序升序排列,而-r表示反序,-k可以指定按第幾個字段來排序。
1)提取IP地址及訪問量
#?awk??'{ip[$1]++}?END{for(i?in?ip)?{print?i,ip[i]}}'?/var/log/httpd/access_log
2)對第1)步的結果根據訪問量排名
#?awk??'{ip[$1]++}?END{for(i?in?ip)?{print?i,ip[i]}}'?/var/log/httpd/access_log?|?sort?-nr?-k?2
輸出黑名單文件:
#?awk??'{ip[$1]++}?END{for(i?in?ip)?{print?i,ip[i]}}'?/var/log/httpd/access_log?|?awk?‘$1>=500{print?$2}’?>>ip.log?????##次數由工作性質來定
?統計有哪些客戶在登錄,登錄次數:
#?who?|awk?'{IP[$1]++}?END{for(i?in?IP){print?i,IP[i]}}'
#?head?/etc/passwd??|?awk?-F?":"?'{?usergrp[$1]=$3}END{print??usergrp["bin"]}'
#?head?/etc/passwd?|?awk?'{i++}END{print?i}'
#?head?/etc/passwd?|?awk?'{usergrp[1]++;print?usergrp[1]?}'
#?awk?'{usergrp[$0]++}END{for(x?in?usergrp){print?x,usergrp[x]}?}'?user.txt
#?head?/etc/passwd?|?awk?-F?":"?'{usergrp[i++]=$1}END{?for(x=0;x<=9;x++)?{print?"usergrp["x"]="?usergrp[x]}?}'
#?head?/etc/passwd??|?awk?-F?":"?'{?usergrp[$1]=$3}END{for(?x??in??usergrp){print??x}?????}'
#?head?/etc/passwd??|?awk?-F?":"?'{?usergrp[$1]=$3}END{for(?x??in??usergrp){print??x,usergrp[x]}?????}'
#?awk?'BEGIN{a[0]=1;a[1]=2;a[2]=3;
??????for(i?in?a){print?a[i]}??}'
#?awk?'BEGIN{t[a]=1;t[b]=2;t[f]=3;
??????for(j?in?t){print?t[j]}??}'
針對數據文件,利用awk 判斷符合條件的數據,并篩選出結果數據,輸入到對應的文件中。
awk '{if ($7>5) print}' A|less ###篩選A文件中第七列大于5的數據,顯示所有符合的結果 awk '{if ($6>5 && $7>5) print}' A|less ###篩選A文件中第六列和七列都大于5的數據,顯示所有符合的結果 awk '{if ($6>5 || $7>5) print}' A|less ###篩選A文件中第六列或七列都大于5的數據,顯示所有符合的結果 awk '{if ($7>5) print}' A|less>B ###篩選A文件中第七列大于5的數據,并將符合的結果輸入到B文件中?
總結
以上是生活随笔為你收集整理的awk命令详解+示例的全部內容,希望文章能夠幫你解決所遇到的問題。