Linux命令詳解之mawk,命令詳解mawk

來源:互聯網
上載者:User

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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.