awk知識點小結1

myownstars發表於2013-07-05

awkmain input迴圈組成,一個迴圈是一個例程,每個例程重複執行直到滿足終止條件;

 

模式匹配

/^$/ {print “This is a blank line.”}  --尋找空行並列印提示資訊

~用於測試一個欄位的正規表示式,!~表示不匹配

$5 ~ /MA/ { print $1 “, “ $6}

 

註釋

#開頭,換行符結束,可在任何地方新增

 

條件語句

If ( condition) {

   Action1

}

[ else

  Action2

]

 

條件運算子

Expr ? action1 : action2

 

迴圈

While (condition) {

   Action1

}

 

Do {

   Action1

} While (condition)

 

For (expr1; expr2; expr3)

  Action1

 

陣列

Array[subscript] = value

Delete array[subscript]

下標可以是一個字元或一個數值,為稀疏陣列

ARGV—命令列引數的陣列,第1個下標為0,最後一個為ARGC – 1

ENVIRON –環境變數陣列,

BEGIN {

   For( x = 0; x < ARGC; ++x)

      If( ARGV[x] !~ /^[0-9]+$/ ) {  --尋找非數字

          Print ARGV[x], “is not an integer.”

          Exit 1

     }

}

 

--列印當前所有系統變數

[oracle@ ~]$ more environ.awk

BEGIN {

  for (env in ENVIRON)

    print env "=" ENVIRON[env]

}

[oracle@ ~]$ awk -f environ.awk

TERM=vt100

….

SHELL=/bin/bash

 

 

字串函式

gsub(r,s,t) –在字串t中用s替換和正規表示式r匹配的所有字串,若沒有t則給出$0

sub(r,s,t) –

注:gsub()global替換,而sub()只實現第一個位置

index(s,t) –返回ts中的位置

length(s)

match(s,r) –如果正規表示式rs中出現,則返回出現的起始位置

substr(s, p, n) – 返回s中從p開始最大長度為n的子串

tolower(s)/toupper(s)

split(string, array, separator) --將任何字串string分解到陣列array

 

z = split($1, array, “ “)

For ( i = 1; I <= Z; i++)

  Print I, array[i]

 

[oracle@ ~]$ cat test[1-3]

I am test1

I am test2

I am test3

[oracle@ ~]$ cat test

.so "test1"

this is 2nd line

.so test"2

this is 4rd line

.so test3

[oracle@ ~]$ cat gsub.awk  --搜尋以.so開頭的行,對其第2個引數去除,接著執行cat $2,最後next

/^\.so/ {

gsub(/"/,"",$2)

system("cat " $2)

next

}

{ print }

[oracle@ ~]$ awk -f gsub.awk test

I am test1

this is 2nd line

I am test2

this is 4rd line

I am test3

 

 

內建函式

 

Getline

類似awknext,即讀取下一行資料;

返回值:1—讀取成功 0—遇到檔案末尾 -1—遇到錯誤

 

從檔案讀取資料

While ((getline < “data” ) > 0) –列印檔案data的所有行

   Print

 

從輸入中讀取下一行並賦給變數(行資料沒有分解成欄位,因此NF不起作用)

Begin { printf “Enter your name:”  getline name < “-“  print name}

 

從管道讀取輸入(將結果賦給$0)

[oracle@ ~]$ more user.awk  --檢視當前usershell設定

BEGIN {

"who am i" | getline

name = $1

FS = ":"

}

name ~ $1 {print $7}

[oracle@ ~]$ awk -f user.awk /etc/passwd

/bin/bash

 

Close()

關閉開啟的檔案和管道

 

System()

返回被執行命令的退出狀態,0為成功

[oracle@ ~]$ cat test2

first:second

one:two

[oracle@ ~]$ awk 'BEGIN { if(system("rm test2") == 0) print "test2 is dropped"}'

test2 is dropped

[oracle@ ~]$ ls test2

ls: test2: No such file or directory

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-765617/,如需轉載,請註明出處,否則將追究法律責任。