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