Linux命令詳解之mawk,命令詳解mawk
pattern scanning and text processing language
文法:
mawk [-F value] [-v var=value] [--] 'program text' [file...]
mawk [-F value] [-v var=value] [-f program-file] [--] [file...]
描述:
awk是一種文本資料處理語言,而mawk是針對這種語言的一種解譯器。
awk程式由pattern{action}序列及函數定義組成。輸入的資料根據RS(Record seperator,預設=‘\n’)劃分為逐個的記錄,每個記錄均與pattern進行比較,若匹配,執行相應action。
選項:
-F
設定field seperator,FS,根據該值將record分為field
-f
awk程式檔案
-v var=value
設定程式變數
--
指示mawk命令的選項說明結束
下面介紹AWK語言
1,程式結構
前面提到,awk程式由pattern{action}序列或函數定義組成。
其中,pattern可以是
BEGIN
END
expression
expression, expression
若action省略,隱含執行print,若pattern省略,則隱含為匹配正確。
語句根據分行符號及分號判斷為結束。
使用#進行注釋
控制流程包括
if(expr) statement
if( expr ) statement else statement
while ( expr) statement
do statement while (expr)
for(opt_expr ; opt_expr; opt_expr) statement
for(var in array) statement
continue
break
2,資料類型,轉換和比較
有數值類型及字串類型兩種,其中,所有數字都用浮點數進行表示並完成計算。
3,Regex
expr ~ /r/
Regex用斜線括住,若expr服從該Regex,則為真,否則為假。不服從用“!~”表示。
/r/ {action}與$0 ~ /r/ {action}等價。
4,Records與Fields
一次讀一行,即一個Records,並根據FS劃分為Fields,$0表示整個Records,$1,$2,...,$NF分別代表對應的Field,內建變數NF為field的總數,高於NF的Fields設定為“”
NR及FNR每次增加1,所代表含義後文中有說明。
給上述內建變數賦值,會導致相關變數發生變化。
5,運算式和操作符
與C語言中操作符大部分一致,特殊的有in(array membership)、~(!~,matching)、$(field)。
6,數組
awk提供一維數組,使用A[1]或A["1"]訪問元素
delete array[expr]會刪除相應元素
if( ( i, j) in A ) print A[i, j]
7,內建變數
CONVFMT:數值到字串的內部轉換格式,預設=“%.6g”
ENVIRON:環境變數數組,var=value被儲存為ENVIRON[var]=value
FILENAME:當前輸入檔案的名字
FNR:在FILENAME檔案中的目前記錄序號
FS:field分隔字元,可以是Regex
NF:目前記錄的field總數
NR:在所有輸入資料流中的record number
OFMT:輸出數值格式,預設為“%.6g”
OFS:輸出時採用的field分隔字元,預設為空白格
ORS:輸出時record分隔字元,預設為分行符號
RS:輸入時的record分隔字元,預設為換行
SUBSEP:used to build multiple array subscripts,預設為“\034”
8,內建函數
(1)字串處理函數
gsub(r, s, t) gsub(r, s)
將t變數中匹配r的字元替換為s,若未指明t,則隱含為$0。最後返回替換數量。
index(s, t)
返回s中t第一次出現的位置,否則返回0,s的第一個字元下標為1
length(s)
返回s的長度
match(s,r)
返回s中r的最長相符下標,無匹配返回0.
split(s,A,r) split(s,A)
根據r將s劃分至A,並返回fields數量,若未設定r,則使用FS
sprintf(format, expr-list)
根據format構造字串
sub(r,s,t) sub(r,s)
只完成一次替換
substr(s,i,n) substr(s,i)
返回s由i至長度為n的子字串
tolower(s)
toupper(s)
(2)數值處理函數
atan2(y,x)
cos(x)
exp(x)
int(x)
log(x)
rand()
sin(x)
sqrt()
srand(expr) srand()
9,輸入與輸出
輸出有print與printf
print
輸出$0
print expr1, expr2, ... , exprn
printf format, expr-list
輸入為getline
getline
讀入一行至$0
getline < file
從file中讀入$0
getline var
讀下條記錄至var
getline var < file
從file中讀取下一條record至var
command | getline
執行command,並從管道中讀取一條record至$0
command | getline var
執行command,並從管道中讀取一條record至var
getline遇到end-of-file時,返回0,錯誤返回-1,正確返回1
close(expr)
關閉與expr聯絡的file或pipe
fflush(expr)
system(expr)執行expr,並返回狀態
10,使用者自訂函數
文法為
function name (args) {statements}
可以包含return opt_expr
11,分割字串,記錄,檔案
12,多行records的處理
13,程式執行
首先會執行BEGIN
然後逐個根據中間的pattern{action}處理各個record
其中可以通過
next
exit opt_expr
改變pattern層級的程式執行順序,碰到next直接read下一條record,並從BEGIN之後繼續執行;exit立即調用END對應的actions,opt_expr為退出碼。
最後執行END