awk工具

awk工具

格式1:前置命令 |awk [選項] '[條件]{編輯指令}'
格式2:awk [選項] '[條件]{編輯指令}' 文件名shell

其中,print是最經常使用的編輯指令,如有多條編輯指令,能夠用分號分隔。
處理文本時,若未指令分隔符,則默認將空格、製表符等做爲分隔符。數組

經常使用選項:
-F:指定分隔符,可省略(默認空格或Tab位)
-V:調用外度shell變量服務器

例:awk -F: '{print $1 "," $7}' /etc/passwd
輸出/etc/passwd文件中以冒號分隔第一、7列,顯示不一樣列之間以逗號隔開。ide

awk -F [:/] '{print $6 $8}' /etc/passwd
以「:」或「/」分隔文本內容,打印第6列和第8列。 工具

awk過濾的時機
BEGIN{編輯指令} 在行前處理
在讀入第一行以前執行測試

{編輯指令} 逐行處理
每讀一行執行一次code

END{編輯指令} 行後處理
在讀完最後一行後執行ip

awk [選項] 'BEGIN{編輯指令}{編輯指令}END{編輯指令}' 文件it

awk [選項] '[選項]/正則匹配/{編輯指令}' 文件class

例:awk -F: '/^[a-d]/{print $2,$4}' /etc/passwd
輸出以a-d開頭的第2列和第4列

awk '/^a|h$/{print}' a.txt
輸出以a開頭或h結尾的行

awk '$6~/bin$/{print}' a.txt
輸出以第6列作匹配,以bin結尾的

awk '$3!~/nologin$/{print}' a.txt
輸出以第3列作匹配,不以nologin結尾的

awk內置變量
FS:保存或設置字段分隔符
$n:指定分隔的第n個字段
$0:當前讀入的整行文本內容
NF:記錄當前處理行的字段個數(列數)
NR:記錄當前已讀入行的數量(行數)

數值比較
==等於、!=不等於

大於、>=大於或等於
<小於、<=小於或等於

邏輯比較測試
&&:邏輯與
||:邏輯或

運算符
+、-、、/、%
++、--、+=、-=、
=、/=

例: awk 'NR==3{print}' a.txt
輸出第三行

awk 'NR%==1{print}' a.txt
輸出奇數行

awk 'NR<=3{print}' a.txt
輸出前3行

awk 'NR>=3{print}' a.txt
輸出第3行到末尾行

awk '$1=="sy"{print}' a.txt
輸出第1列是sy

awk -F: '$1==ENVIRON["USER"]{print $1,$6,$7}' /etc/passwd
輸出當前用戶的用戶名、宿主目錄、登陸shell信息

awk 'NR>=3&&NR<=5{print}' a.txt
輸出第3-5行

awk 'NR==3||NR==5{print}' a.txt
輸出第3行和第5行

awk '$7!~/nologin$/||$1~/^[a-d]/{print}' a.txt
匹配第7列輸出不以nologin結尾,或在第1列匹配以a-d開頭

awk 'BEGIN{X=0}{x++}END{print "值" x}' a.txt
每讀一行x自加1,最後打印x的值

awk 'NR%7==0||/NR~/7/{print}' a.txt
輸出100之內7的倍數,或包含7的數。

awk流程控制
單分支:
if(條件){編輯指令}
雙分支:
if(條件){編輯指令}else{編輯指令}
多分支:
if(條件){編輯指令}else if(條件){編輯指令}else{編輯指令}

例:awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd
統計UID小於或等於500,UID大於500的用戶分別是多少

while循環
while(條件){編輯指令}
例:awk -F[:/] 'BEGIN{i=1}{while(i<=NF){if($i~/root/){j++};i++}}END{print j}' /etc/passwd
統計"root"的次數

awk數組
定義數組
格式:數組名[下標]=值
調用數組
格式:數組名[下標]
遍歷數組
格式:for(變量 in 數組名){print 數組名[變量]}

例:awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' a.txt統計每一個IP地址訪問服務器的次數

相關文章
相關標籤/搜索