搜尋
首頁php教程PHP开发linux awk命令詳解

linux awk命令詳解

Dec 15, 2016 am 10:38 AM

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 & $0

print 是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  file

BEGIN{

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) // 含

 

輸出分隔符號OFS

awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="t" netstat.txt

awk '$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/passwd

small

small

small

large

IN if($3>100) {A++; print "large"} else {B++; print "small"}} END{print A,"t",B}' /etc/passwd 

                                                                  //ID大於100,A加1,否則B加1

awk -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

 

EG=iwhile 語句

} {while(i

7 root 1

7 x 2

7 0 3

7 0 4

7 0 3

7 0 4

7 0 3

7 0 4

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命令详解


更多linux awk指令詳解相關文章請關注PHP中文網!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

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

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境