日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

awk命令详解+示例

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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/lYkKYBMnn6rmw4QsKSHTiEWxQlKaT2EZaMVrugXVVpWN6quDkMoPcSg1

awk的內置變量

變量

用途

示例

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以內,能同時被313整除的整數個數:

#?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命令详解+示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。