首頁 >php教程 >PHP开发 >awk命令詳解

awk命令詳解

高洛峰
高洛峰原創
2016-12-15 10:36:231346瀏覽

awk指令詳解

簡單使用:

awk :對於文件中一行行的獨處來執行操作 。

awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域印出來 。

 

 

詳細介紹:

AWK命令介紹

 

awk語言的最基本功能是在文件或字符串中基於指定規則和抽取信息,awk完整的awk腳本通常用來格式化文字檔案中的資訊

 

1.   呼叫awk:

 

第一種命令列方式,如同一份鎧input-file(s)

 

這裡commands是真正的awk命令,[-F域分隔符]是可選的,awk預設使用空格分隔,因此如果要瀏覽域間有空格的文本,不必指定這個選項,但若瀏覽如passwd文件,此文件各網域使用冒號作為分隔符,則必須使用-F選項:   awk -F : 'commands' input-file

 

   第二種,將所有awk指令插入一個一個文件,並使awk程式可執行,然後用awk命令解釋器作為腳本的首行,以便透過鍵入腳本名稱來調用它

 

   第三種,將所有awk命令插入一個單獨文件,然後調用,如: 

 

awk -f awk-script-file input-file

 

-f選自文件awk-script-file 2.   awk腳本:

 

    awk腳本由各種操作和模式組成,根據分隔符號(-F選項),預設為空格,讀取的內容依序放置到對應的域中,一行記錄讀取,直到文件尾

 

2.1.      模式和動作   

 

任何awk語句都是由模式和動作組成,在一個awk腳本中可能有許多語句。模式部分決定動作語句何時觸發及觸發事件。動作即對資料進行的操作,如果省去模式部分,動作將時時刻刻保持執行狀態

 

    模式可以是任何條件語句或複合語句或正規表示式,模式包含兩個特殊欄位BEGIN和END,使用BEGIN語句設定計數和列印頭,BEGIN語句使用在任何文字瀏覽動作之前,之後文字瀏覽動作依據輸入檔開始執行;END語句用來在awk完成文字瀏覽動作後列印輸出文字總數和結尾狀態標誌,有動作必須使用{}括起來

 

    實際動作在大括號{}內指明,常用來做打印動作,但是還有更長的代碼如if和循環looping語句及循環退出等,如果不指明採取什麼動作, awk預設列印所有瀏覽出的記錄

 

2.2.     域和記錄:

 

awk執行時,其瀏覽標記為$1,$2...$n,此方法稱為域標記。使用$1,$3表示參考第1和第3域,注意這裡使用逗號分隔域,使用$0表示使用所有域。例如:

 

awk '{print $0}' temp.txt > sav.txt  

 

表示列印所有領域並將結果重新導向至sav.txt .txt|tee sav.txt 

 

 和上例相近,不同的是顯示螢幕上

 

awk '{print $1,及第4域

 

awk 'BEGIN {print "NAME  GRADEn----"} {print $1"t"$4}' temp.txt 

 

表示打訊息頭,也就是輸入的內容的第一個行前加上"NAME  GRADEn-------------",同時內容以tab分開

 

awk 'BEGIN {print "being"} {print $1} END {print "end" }' temp 

 

同時列印訊息頭與資訊尾

 

2.3.     條件操作符:

 =!不符合正規表示式

 

    匹配:awk '{if ($4~/ASIMA/) print $0}' temp 表示如果第四域包含ASIMA,則列印整個製作

 🠎 =="48" {print $0}' temp    只印第3域等於"48"的記錄

 

    不符:  awk '$0 ! 

    不等於:  awk '$1 != "asima"' temp

 

    小於:    awk '{if ($1

 

    設定大小寫: awk '/[Gtempreen/    設定尺寸寫: awk '/[Gtemp]dm

 

    任意字元: awk '$1 ~/^...a/' temp    列印第1域中第四個字元是a的記錄,符號'^'代表行首,符合'.'代表任意字元

    或關係配對: awk '$0~/(abc)|(efg)/' temp   使用|時,語句需要括起來

 

 與=="b" ) print $0}' temp

 

    OR或關係:   awk '{if ($1=="a" || $1=="b") print $0}' temp

4. awk內建變數:

例: awk 'END {print NR}' temp    在最後列印已讀取記錄列數awk命令詳解

 

 

 

    awk '{if (NR>0 && $4~/Brown/) print $0}' temp  至少有一筆記錄且包含Brown

 

$   print $NF}'   顯示目前目錄名

 

2.5.     awk運算子:

 

型在awk使用運算符,基本運算式可分割型數型數組數、元變數型

 

設定輸入域到變數名稱:

 

    awk '{name=$1;six=$3; if (six=="man") print name " is "$1;six=$3; if (six=="man") print name " is " six)'比較操作:

 

awk 'BEGIN {BASE="27"} {if ($4 

   

awk '{if ($1=="asima") $6=$6-1;print $1,$6,$7}' temp

 

    asima) ($1=="desc");print $1}' temp

 

    只顯示修改記錄:(只顯示所需的,區別上一條指令,注意{})

 

$1=="asima) {$1=="desc";print$1}}' temp

 

    建立新的輸出域:

 

awk '{$4=$3-$2; print $44]

    統計列值:

 

awk '(tot+=$3);END {print tot}' temp        tot} ' temp         只顯示最後的結果

 

    文件長度相加:

 

ls -l| totKB:" tot}'

 

    只列出檔案名稱:

 

ls -l|awk '{print」 k內建字串函數:

 

gsub(r,s)           在整個$0中使用s替代r

 

awk 'gsub(/name/,"xing" s ,t)         在整個t中用s替代r

 

index(s,t)          返回s中字符串t的第一位置

 

awk 'BEGIN {print index("Sunny","ny") }' temp     回傳4

 

length(s)           返回s的長度🠎  

 

awk '$1=="J.Lulu" {print match($1,"u")}' temp    回傳4

 

split(s,a,fs)       在fs上將sEG序列a

IN #6789",myarray,"#")"'

 

回3,同時myarray[1]="12", myarray[2]="345", myarray[3]="6789"

 

sprint(fmt,exp)     

sprint(fmt,exp)     

sprint(fmt,exp)     

格式化後的exp

 

sub(r,s)   從$0中最左邊最長的子字串中用s代替r(只更換第一遇到的配對字串)

 

substr(s,p)字符串中從p開始的字尾部分

 

substr(s,p,n)       返回字串s中從p開始長度為n的字尾部分

 🜠 : echo "65" |awk '{printf "%cn",$0}'    輸出A

 

          

 

格式化輸出:awk '{ printf "%-15s awk '{if ($5

 

who | awk '{if ($1==user) print $1 " are in " $2 ' user=$LOGNAME 使用環境變數

🎠

🎠

🎠

awk腳本指令:

 

開頭使用 !/bin/awk -f  ,如果沒有這句話自含腳本將不能執行,範例:

 

!/bin/ comment lines must start with a hash '#'

 

# name: student_tot.awk

 

# to call: student_tot.awkpoint.al.

 

# print a header first

 

BEGIN

 

{

 

print "Name  Joined Gained  Point Available"

 

print" ================================================== ======="

 

}

 

# let's add the scores of points gained

 

(tot+=$6); tal and average point

 

END

 

{

 

    print "Club student total points :" tot

    print "Club student total points :" tot

    print "Club student total points :" tot

age print N

 

}

 

2.9.     awk陣列:

 

awk的循環基本結構

 

For (element in array) print array[element]

 

"#")} 

 

END { for (i in myarray) {print myarray[i]} }

 

 

3.0 

if(表達式) #if ( Variable in Array )

語句1

else

語句2

格式中"語句1"可以是多個語句,如果你為了判斷Unix awk也方便好將多個語句用{}括起來。 Unix awk分枝結構允許嵌套,其格式為:

if(表達式)

{語句1}

else if(表達式)

{語句2}

else

{語句3}

@localhost nginx]# awk 'BEGIN{ 

test=100;

if(test>90)

{

    print "非常

else

{

    print "no pass";

}

}'

very good

 

每條指令語句後面可以用「;」號結尾。

 

二.循環語句(while,for,do)


1.while語句

格式:

while(表達式)

} awk 'BEGIN{ 

test=100;

total=0;

while(i{

    total+=i;
    i++;
}
.

for迴圈有兩種格式:


格式1:

for(變數in 陣列)

{語句}

範例:

[chengmo@localhost nginx]# aw範例:

[chengmo@localhost nginx]# awg 'RONBIN  
{
    print k"="ENVIRON[k];
}

}'

AWKPATH=.:/usr/share/awk

OLDPWD=/home/web97

/SS_ASKPASSc/home/web -askpass

SELINUX_LEVEL_REQUESTED=

SELINUX_ROLE_REQUESTED=

LANG=zh_CN.GB2312

。 。 。 。 。 。

說明:ENVIRON 是awk常數,是子典型數組。

格式2:

for(變數;條件;表達式)

{語句}

範例:

[chengmo@localhost nginx]# awk 'BEGIN{ 
[chengmo@localhost nginx]# awk 'BEGIN{ 
[3]]; i{
    total+=i;
}
print total;
}'

5050

3.do循環例:

[chengmo@localhost nginx]# awk 'BEGIN{ 

total=0;

i=0;

do

{

    total+=i;

do

{

    total+=i;

}'
5050

 

以上為awk流程控制語句,從語法上面大家可以看到,與c語言是一樣的。有了這些語句,其實很多shell程式都可以交給awk,而且效能是非常快的。


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

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