程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> Linux AWK命令使用

Linux AWK命令使用

編輯:PHP綜合

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

調用awk:

第一種,命令行方式,如:

awk [-F 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進行浏覽的文件名

awk腳本:

awk腳本由各種操作和模式組成,根據分隔符(-F選項),默認為空格,讀取的內容依次放置到對應的域中,一行一行記錄讀取,直到文件尾
    模式和動作:任何awk語句都是由模式和動作組成,在一個awk腳本中可能有許多語句。模式部分決定動作語句何時觸發及觸發事件。動作即對數據進行的操作,如果省去模式部分,動作將時刻保持執行狀態
     模式可以是任何條件語句或復合語句或正則表達式,模式包含兩個特殊字段BEGIN和END,使用BEGIN語句設置計數和打印頭,BEGIN語句使用在任 何文本浏覽動作之前,之後文本浏覽動作依據輸入文件開始執行;END語句用來在awk完成文本浏覽動作後打印輸出文本總數和結尾狀態標志,有動作必須使用 {}括起來
    實際動作在大括號{}內指明,常用來做打印動作,但是還有更長的代碼如if和循環looping語句及循環退出等,如果不指明采取什麼動作,awk默認打印出所有浏覽出的記錄

域和記錄:

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 同時打印信息頭和信息尾

條件操作符:

=、~匹配正則表達式、!~不匹配正則表達式
    匹配:awk '{if ($4~/ASIMA/) print $0}' temp 表示如果第四個域包含ASIMA,就打印整條
         awk '$0 ~ /ASIMA/' temp 表示只要整條包含ASIMA就打印出來
    精確匹配:awk '$3=="48" {print $0}' temp    只打印第3域等於"48"的記錄
    不匹配: awk '$0 !~ /ASIMA/' temp      打印整條不包含ASIMA的記錄
    不等於: awk '$1 != "asima"' temp
    小於:    awk '{if ($1    設置大小寫: 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

awk內置變量:

 ARGC   命令行參數個數    

    AGRV   命令行參數排列      

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

    FILENAME   awk浏覽的文件名   

    FNR   浏覽文件的記錄數   

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

    NF    浏覽記錄的域個數   

    NR   已讀的記錄數    

    OFS   輸出域分隔符

    ORS 輸出記錄分隔符     

    RS   控制記錄分隔符
     例: 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}'   顯示當前目錄名

awk操作符:

在awk中使用操作符,基本表達式可以劃分成數字型、字符串型、變量型、域及數組元素
    設置輸入域到變量名:
       awk '{name=$1;six=$3; if (six=="man") print name " is " six}' temp
    域值比較操作:
       awk 'BEGIN {BASE="27"} {if ($4

    修改數值域取值:(原輸入文件不會被改變)
       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域

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的後綴部分

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 將第一個域全部左對齊顯示

其他awk用法:

向一行awk命令傳值:

awk '{if ($5        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       Jason                         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

}

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]} }
*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved