awk
用于在linux/unix下對文本和數據進行處理,支持用戶自定義函數和動態正則表達式等先進功能。
命令格式:
awk 'BEGIN{ print “start” } pattern { commend } END{print "end"}' file
awk "BEGIN{ print “start” } pattern { commend } END{print "end"}" file
awk命令也可以從stdin中讀取
構成:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊。這三個部分是可選的。任意一個部分都可以不出現在腳本中。
awk的工作原理:
第一步:執行BEGIN{ commands }語句塊中的語句;
第二步:從文件或標準輸入(stdin)讀取一行,然后執行pattern{ commands }語句塊,它逐行掃描文件,從第一行到最后一行重復這個過程,直到文件全部被讀取完畢。
第三步:當讀至輸入流末尾時,執行END{ commands }語句塊。
內置變量:
ARGC 命令行參數個數
ARGV 命令行參數排列
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數
FS 設置輸入域分隔符,等價于命令行 -F選項
NF 瀏覽記錄的域的個數
NR 已讀的記錄數
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
$0 這個變量包含執行過程中當前行的文本內容
$1~$n 這個變量包含第1(n)個字段的文本內容
常用選項:
-F fs 指定用于輸入數據的列分隔符fs
-v var=value 在awk程序執行之前指定一個值value變量給var。這些變量值用于awk程序的BEGIN塊
-f program-file 指定一個awk程序文件,代替在命令行指定awk指令
打印指定的列
輸出格式:print和printf(可指定格式)
- print的使用格式:print item1, item2, …
- printf的使用格式:printf format, item1, item2, …
$ awk '{print $1,$2}' a.txt 打印a.txt文件的第一列,第二列
設置字段定界符
$ awk -F:'{print $NF}' /etc/passwd 或者
$ awk 'BEGIN{ FS=":" }{ print $NF }' /etc/passwd
模式
有以下四種模式:
一:/正則表達式/:使用通配符的擴展集。
二:關系表達式:使用運算符進行操作,可以是字符串或數字的比較測試。
三:模式匹配表達式:用運算符 ~(匹配)和 ~!(不匹配)。
四:BEGIN語句塊、pattern語句塊、END語句塊
操作
由一個或多個命令、函數、表達式組成,之間由換行符或分號隔開,并位于大括號內
主要部分:變量或數組賦值,輸出命令,內置函數,控制流語句
傳參:
- 傳外部變量給awk
-v 可以將外部值(并非來自stdin)傳遞給awk:
var=10000 echo | awk -v variable=$var '{ print variable }'
- 另一種傳遞外部變量方法:
var1="aaa" var2="bbb" echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2
- 當輸入來自于文件時使用:
awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename
變量之間用空格分隔作為awk的命令行參數跟隨在BEGIN、{}和END語句塊之后。
數組應用
awk 中的數組不必提前聲明。數組元素用0或空字符串來初始化。
數組的定義
數字做數組索引:
Array[1]="sun" Array[2]="kai"
字符串做數組索引:
Array["first"]="www" Array["last"]="name"
print Array[1]會打印出sun;print[“last”]會得到name。
讀取數組的值:
{ for(item in array) {print array[item]}; } 輸出的順序是隨機的
{ for(i=1;i<=len;i++) {print array[i]}; } Len是數組的長度
數組相關函數
得到數組長度:
awk 'BEGIN{info="it is a test";lens=split(info,tA,""); print length(tA) length(tA),lens;}' 結果為:4 4
length返回數組長度,split進行分割字符串為數組,也會返回分割得到數組長度。
輸出數組內容(無序,有序輸出):
awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}' 4 test 1 it 2 is 3 a
awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}' 1 it 2 is 3 a 4 test
==注意==:數組下標是從1開始,與C數組不一樣。
內置函數
主要分以下4種類型:算數函數、字符串函數、其它一般函數、時間函數。
算數函數:
格式 描述
sin( x ) 返回 x 的正弦;x 是弧度。
exp( x ) 返回 x 冪函數。
log( x ) 返回 x 的自然對數。
sqrt( x ) 返回 x 平方根。
int( x ) 返回 x 的截斷至整數的值。
rand( ) 返回任意數字 n,其中 0 <= n < 1。
srand( [expr] ) 將 rand 函數的種子值設置為 Expr參數的值,或如果省略 Expr 參數則使用某天的時間。返回先前的種子值。
字符串函數
split( String, A, [Ere] ) 將String參數指定的參數分割為數組元素A[1],A[2],...,A[n],并返回n變量的值。
tolower( String )
返回 String 參數指定的字符串,字符串中每個大寫字符將更改為小寫。
toupper( String )
“`返回 String 參數指定的字符串,字符串中每個小寫字符將更改為大寫。