awk命令詳解二


awk命令詳解

簡單使用:

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

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

 

 

詳細介紹:

 

AWK命令介紹

 

awk語言的最基本功能是在文件或字符串中基於指定規則瀏覽和抽取信息,awk抽取信息后,才能進行其他文本操作,完整的awk腳本通常用來格式化文本文件中的信息

 

1.   調用awk:

 

第一種命令行方式,如:

 

awk [-Field-separator] 'commands' 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的awk腳本,input-file是使用awk進行瀏覽的文件名

 

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中

 

awk '{print $0}' temp.txt|tee sav.txt 

 

 和上例相似,不同的是將在屏幕上顯示出來

 

awk '{print $1,$4}' temp.txt

 

   只打印出第1和第4域

 

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

 

表示打信息頭,即輸入的內容的第一行前加上"NAME  GRADE\n-------------",同時內容以tab分開

 

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

 

同時打印信息頭和信息尾

 

2.3.     條件操作符:

 

    <、<=、==、!=、>=、~匹配正則表達式、!~不匹配正則表達式

 

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

 

    精確匹配:awk '$3=="48" {print $0}' temp    只打印第3域等於"48"的記錄

 

    不匹配:  awk '$0 !~ /ASIMA/' temp      打印整條不包含ASIMA的記錄

 

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

 

    小於:    awk '{if ($1<$2) print $1 "is smaller"}' temp

 

    設置大小寫: awk '/[Gg]reen/' temp      打印整條包含Green,或者green的記錄

 

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

 

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

 

    AND與關系:  awk '{if ( $1=="a" && $2=="b" ) print $0}' temp

 

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

 

2.4.     awk內置變量:

 

ARGC  

命令行參數個數

NF    

 瀏覽記錄的域個數

AGRV  

命令行參數排列

NR  

已讀的記錄數   

ENVIRON  

支持隊列中系統環境變量的使用

OFS  

輸出域分隔符

FILENAME  

awk瀏覽的文件名  

ORS 

輸出記錄分隔符

FNR  

瀏覽文件的記錄數  

RS  

控制記錄分隔符

FS  

設置輸入域分隔符,同- F選項

NF    

 瀏覽記錄的域個數

 

例: awk 'END {print NR}' temp    在最后打印已讀記錄條數

 

    awk '{print NF,NR,$0} END {print FILENAME}' temp

 

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

 

    NF的另一用法:  echo $PWD | awk -F/ '{print $NF}'   顯示當前目錄名

 

2.5.     awk操作符:

 

在awk中使用操作符,基本表達式可以划分成數字型、字符串型、變量型、域及數組元素

 

設置輸入域到變量名:

 

    awk '{name=$1;six=$3; if (six=="man") print name " is " six}' temp

 

    域值比較操作:

 

awk 'BEGIN {BASE="27"} {if ($4<BASE) print $0}' temp

 

    修改數值域取值:(原輸入文件不會被改變)

 

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

 

    修改文本域:

 

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

 

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

 

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

 

    創建新的輸出域:

 

awk '{$4=$3-$2; print $4}' temp

 

    統計列值:

 

awk '(tot+=$3);END {print tot}' temp           會顯示每列的內容

 

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

 

    文件長度相加:

 

ls -l|awk '/^[^d]/ {print $9"\t"$5} {tot+=$5} END{print "totKB:" tot}'

 

    只列出文件名:

 

ls -l|awk '{print $9}'     常規情況文件名是第9域

 

2.6.     awk內置字符串函數:

 

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

 

awk 'gsub(/name/,"xingming") {print $0}' temp

 

gsub(r,s,t)         在整個t中用s替代r

 

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

 

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

 

length(s)           返回s的長度

 

match(s,r)          測試s是否包含匹配r的字符串

 

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

 

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

 

awk 'BEGIN {print split("12#345#6789",myarray,"#")"'

 

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

 

sprint(fmt,exp)     返回經fmt格式化后的exp

 

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

 

substr(s,p)         返回字符串s中從p開始的后綴部分

 

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

 

2.7.     printf函數的使用:

 

字符轉換: echo "65" |awk '{printf "%c\n",$0}'    輸出A

 

            awk 'BEGIN {printf "%f\n",999}'        輸出999.000000

 

格式化輸出:awk '{printf "%-15s %s\n",$1,$3}' temp 將第一個域全部左對齊顯示

 

2.8.     其他awk用法:

 

    向一行awk命令傳值:

 

awk '{if ($5<AGE) print $0}' AGE=10 temp

 

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

 

awk腳本命令:

 

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

 

!/bin/awk -f

 

# all comment lines must start with a hash '#'

 

# name: student_tot.awk

 

# to call: student_tot.awk grade.txt

 

# prints total and average of club student points

 

# print a header first

 

BEGIN

 

{

 

print "Student    Date   Member No.  Grade  Age  Points  Max"

 

print "Name  Joined Gained  Point Available"

 

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

 

}

 

# let's add the scores of points gained

 

(tot+=$6);

 

# finished processing now let's print the total and average point

 

END

 

{

 

    print "Club student total points :" tot

 

    print "Average Club Student points :" tot/N

 

}

 

2.9.     awk數組:

 

awk的循環基本結構

 

For (element in array) print array[element]

 

awk 'BEGIN {record="123#456#789";split(record,myarray,"#")} 

 

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

 

 

3.0  awk中自定義語句

 

一.條件判斷語句(if)

if(表達式) #if ( Variable in Array )
語句1
else
語句2

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

if(表達式)

{語句1}

else if(表達式)
{語句2}
else
{語句3}

[chengmo@localhost nginx]# awk 'BEGIN{ 
test=100;
if(test>90)
{
    print "very good";
}
else if(test>60)
{
    print "good";
}
else
{
    print "no pass";
}
}'

very good

 

每條命令語句后面可以用“;”號結尾。

 

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

1.while語句

格式:

while(表達式)

{語句}

例子:

[chengmo@localhost nginx]# awk 'BEGIN{ 
test=100;
total=0;
while(i<=test)
{
    total+=i;
    i++;
}
print total;
}'
5050

2.for 循環

for循環有兩種格式:

格式1:

for(變量 in 數組)

{語句}

例子:

[chengmo@localhost nginx]# awk 'BEGIN{ 
for(k in ENVIRON)
{
    print k"="ENVIRON[k];
}
}'

AWKPATH=.:/usr/share/awk
OLDPWD=/home/web97
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
LANG=zh_CN.GB2312

。。。。。。

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

格式2:

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

{語句}

例子:

[chengmo@localhost nginx]# awk 'BEGIN{ 
total=0;
for(i=0;i<=100;i++)
{
    total+=i;
}
print total;
}'

5050

3.do循環

格式:

do

{語句}while(條件)

例子:

[chengmo@localhost nginx]# awk 'BEGIN{ 
total=0;
i=0;
do
{
    total+=i;
    i++;
}while(i<=100)
print total;
}'
5050

 

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

break 當 break 語句用於 while 或 for 語句時,導致退出程序循環。
continue 當 continue 語句用於 while 或 for 語句時,使程序循環移動到下一個迭代。
next 能能夠導致讀入下一個輸入行,並返回到腳本的頂部。這可以避免對當前輸入行執行其他的操作過程。
exit 語句使主輸入循環退出並將控制轉移到END,如果END存在的話。如果沒有定義END規則,或在END中應用exit語句,則終止腳本的執行。

以上關於awk的控制判斷轉自博客:http://www.cnblogs.com/chengmo/archive/2010/10/04/1842073.html

來源:http://www.cnblogs.com/guolanzhu/p/5774305.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM