awk是行處理器: 相比較螢幕處理的優點,在處理龐大檔案時不會出現記憶體溢位或是處理緩慢的問題,通常用來格式化文字訊息
awk處理過程: 依序對每一行處理,然後輸出
awk指令形式:
awk [-F|-f|-v] 'BEGIN{} //{command1; command2} END{}' file
[-F|-f|-v]大參數,-F指定分隔符,-f呼叫腳本,-v定義變數var=value
' ' 引用程式碼區塊
BEGIN 初始化程式碼區塊,在對每一行進行處理之前,初始化程式碼,主要是全域引用變量,設定FS分隔符號
// 匹配代碼區塊,可以是字串或正規表示式
{} 指令碼區塊,包含一條或多條指令號指令; 結尾程式碼區塊,在對每一行進行處理之後再執行的程式碼區塊,主要是進行最終計算或輸出結尾摘要資訊
特殊要點:
$0
NF 欄位數量變數NR 每行中的記錄號,多重檔案記錄遞增FNR 製表符n 換行符FS BEGIN時定義分隔符號RS 輸入的記錄分隔符,且預設為換行符(即文字是按列 不符,不精確比較== 等於,必須全部相等,精確比較!= 不等於,精確比較& + 配對時表示1個或1個以上/ [0-9][0-9]+/ 兩個以上數字/[0-9][0-9]*/ 一個或一個以上數字FILENAME 檔名號分隔
OFS 符, 預設也是空格,可以改為製表符等ORS 輸出的記錄分隔符,預設為換行符,即處理結果也是一行一行輸出到螢幕-F'[:#/]' 定義三個分隔符號 print & $0print 是awk列印指定內容的主要指令awk '{print}' /etc/passwd == 9 print " "}' /etc/passwd awk是一行一行處理文字awk '{print "a"}' /etc/ passwd /etc/passwd awk -F: '{print $1; print $2}' /等等。輸出欄位1,3,6,以製表符為分隔符號 -f指定腳本檔案awk -f script.awk fileBEGIN{FS=" print $1} //效果與awk -F":" '{print $1}'相同,只是分隔符號使用FS在程式碼本身指定 awk 'BEGIN{X=00} /^$/{ X=0}+ 1 } END{print "I find",X,"blank lines."}' test I find 4 blank lines. ls -l|awk 'BEGIN{sum=0} !/^d/{sum+== $5} END{print "total size is",sum}' //計算檔案大小total size is 17487)
total size is 17487
$1 指指定分隔符後,第一個字段,$3第三個字段, t是製表符
一個或多個連續的空格或製表符看做一個定界符,即多個空格看做一個空格
awk -F":" '{print $1}' /etc/passwd
awk -F":" '{print $1 $3}' /etc/pass
awk -F":" '{print $1,$3}' /etc/passwd //多了一個逗號,$1與$3 用空格分隔etc/passwd //$1與$3之間手動新增空格分隔
awk -F":" '{print "Username:" $1 "tt Uid:" $3 }' /etc/passwd -F: '{print NF}' /etc/passwd //顯示每排中有多少欄位 $ //將每行第NF個欄位的值列印出來
awk -F: 'NF==4 {print }' /etc/passwd //顯示只有4個欄中 //顯示每行欄位數大於2的行
awk '{print NR,$0}' /etc/passwd ",$0}' /etc/passwd //依序列印行號,欄位數,最後欄位值,製表符,每行內容
awk -F: 'NR==5{print}' /etc/pass /顯示第5行
awk -F: 'NR==5 || NR==6{print}' /etc/passwd //顯示第5行和第6行
route -n|awk 'NR! =1{print}' 下應用程式中與不匹配/純字元/值匹配 !~//字段值不匹配~/a1|a2/欄位值符合a1或a2
awk '/mysql/' /etc/passwd
awk '/mysql/{print }' /etc/passwd $
awk '/mysql/{print }' /etc/passwd $awk '/mysql/{print $0} ' /etc/passwd //三條指令結果相同
awk '!/mysql/{print $0}' /etc/passwd }' / etc/passwd
awk '!/mysql|mail/{print}' /etc/passwd
awk -F: '/mail/,/mysql/{print}' /etc/passwd aw //區間匹配
'/[2][7][7]*/{print $0}' /etc/passwd //配對包含27為數字開頭的行,如27,277,2777...awk -F: '$1k -F: '$1 ~/mail/{print $1}' /etc/passwd //$1符合指定內容才顯示awk -F: '{if($1~/mail/) print $1}' /etc/passwd //與上方相同awk -F: '$1!~/mail/{print $1}' /etc/passwd //不符awk -F: '$1!~/mail|mysql/{print $1}' /etc/wd IF語句必須用在{}中,且比較內容用()擴充awk -F: '{if($1~/ //簡寫awk -F: '{if($1~/mail/) {print $1}}' /etc/passwd } else {print $2}}' /etc/passwd //if...else... ===
===
= ="mysql"{print $3}' /etc/passwd awk -F":" '{if($1=="mysql") print $3}' /etc/passwd //與上方相同awk -F":" '$1!="mysql"{print $3}' /etc/passwd //不等於
/awk -F":" '$3>1000{print $3 /
//大於awk -F":" '$3>=100{print $3}' /etc/passwd //大於等於. //小於
awk -F":" '$38 {print }' /etc/passwd //邏輯與,$1符合mail,且$3>8
awk -F: '{if($1~/mail/ && $3>8) print }' / etc/passwd
awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd //邏輯或
awk -F: '{if($||1~/mail/ 邏輯或
awk -F: '{if($||3 >1000) print }' /etc/passwd
數值運算
awk -F: '$3 > 100' /etc/passwd
passwd
awk -F: '$3+$4 > 200' /etc/passwd
awk -F: '/my |mail/{print $3+10}' /etc/pass
awk -F: '/mysql/{print $3-$4}' /etc/passwd //減法時
//求積awk '/MemFree/{print $2/1024}' /proc/meminfo //除法awk '/MemFree/{print int($2/1094O) // 含 輸出分隔符號OFSawk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="t" netstat.txtawk '$6 ~ /WAIT/ || NR= =1 {print NR,$4,$5,$6}' OFS="t" netstat.txt //輸出欄位6符合WAIT的行,其中輸出每行行號,欄位4,5,6,並使用制表符分割欄位 輸出處理結果到檔案①在指令碼區塊中直接輸出 route -n|awk 'NR!=1{print > "./fs"}' route -n|awk 'NR!=1{print > "./fs"}' route -n|awk 'NR!=1{print > "./fs"}' route -n|awk 'NR!=1{print > "./fs"}' 輸出 route -n|awk 'NR!=1{print}' > ./fs 格式化輸出netstat -anp|awk '{printf "%-8% %-8 $2,$3}' printf表示格式輸出%格式化輸出分隔符號-8長度為8個字元s表示字串類型列印每行前三個字段,指定第一個字段輸出字串型別(長度為8),第二個欄位輸出字串型別(長度為8),第三個欄位輸出字串型別(長度為10)netstat -anp|awk '$6== "LISTEN" || NR==1 {printf "%-10s %-10s %-10s n",$1,$2,$3}'netstat -anp|awk '$6=="LISTEN" || NR== 1 {printf "%-3s %-10s %-10s %-10s n",NR,$1,$2,$3}' IF語句awk -F: '{if($3>100) print " large"; else print "small"}' /etc/passwdsmallsmallsmalllargeIN if($3>100) {A++; print "large"} else {B++; print "small"}} END{print A,"t",B}' /etc/passwd //ID大於100,A加1,否則B加1awk -F: '{if($3awk -F: 'BEGIN{i=1} {if(i
awk -F: 'BEGIN{i=1} {if(i 另一種形式 awk -F: '{print ($3>100 ? "yes":"no")}' /etc/passwd awk -F: '{print ($3>100 ? $3":tyes":$3":tno")}' /etc/passwd
root 6
備份
netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) print i,"t",a[i]}'
netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) printf "%-20s %-10s %-5s n", i,"t",a[i] } '
9523 1
9929 1
聽 6
7903 1
3038/cupsd 1
791 3 1
10837 1
9833 1
應用1
awk -F: ' { print NF}' helloworld.sh 2,$3,$4,$5}' helloworld.sh //輸出前5個欄位
awawk - F: '{print $1,$2,$3,$4,$5}' OFS='t' helloworld.sh //輸出前5個欄位並使用製表符分隔輸出,
awk -F: '{print NR, $1 ,$2,$3,$4,$5}' OFS='t' helloworld.sh //製表符分隔列印前5個字段,並列印行號
應用2個
] ' '{print NF}' helloworld.sh '{print $1,$2,$3,$4,$5, $6 ,$7}' OFS='t' helloworld.sh //製表符分隔多重欄位
應用3
awk -F'[:#/]' '{print NF //指定三個分隔符,並輸出每行字段數
awk -F'[:#/]' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12 } ' helloworld.sh //製表符分隔寫入多字段
應用4
計算/home目錄下,普通檔案的大小,使用KB作為單位
ls -l|awk 'BEGIN{sumk 'BEGIN{sumk 0 } !/^d/{sum+=$5} END{print "總大小為:",sum/1024,"KB"}'
ls -l|awk 'BEGIN{sum=0} !/^d/ { sum+=$5} END{print "total size is:",int(sum/1024),"KB"}' //int是取整的意思
應用5,c和CONNECT的連接數量分別是多少
netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s n ", i," ",sum[i]}'
應用6
統計/home目錄下不同使用者的普通文件的總數是多少?
ls -l|awk 'NR!=1 && ! /^d/{sum[$3]++} END{for (i in sum) printf "%-6s %-5s %-3s n",i," ",sum[i]}'
mysql 199 199
root 374 統計/home目錄下不同使用者的普通檔案的大小總大小是多少? {for (i in sum) printf "%-6s %-5s %-3s %-2s n",i," ",sum[i]/1024/1024,"MB"}'
應用7
輸出成績表
awk 'BEGIN{math=0;eng=0;com=0;printf "Lineno. Name No. -------------------------------------------------- ---n"}{math+=$3; eng+=$4; com+=$5;printf "%-8s %-7s %-7s %-7s %-9s %-10s %-7s n",NR,$1,$2 ,$3,$4,$5,$3+$4+$5} END{printf "--------------------------------- ---------------------------n";printf "%-24s %-7s %-9s %-20s n","Total: ",math,eng,com;printf "%-24s %-7s %-9s %-20s n","Avg:",math/NR,eng/NR,com/NR}' test0
[root @localhost home]# cat test0
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2321 66 78 45
Tom 21275 7 95
Bob 2415 40 57 62
更多linux awk指令詳解相關文章請關注PHP中文網!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

禪工作室 13.0.1
強大的PHP整合開發環境