awk程式設計

2021-06-21 02:21:49 字數 4386 閱讀 9782

一、awk程式設計模型

awk程式由乙個主輸入迴圈維持,按行輸入,反覆執行,知道終止條件被觸發。

awk定義了兩個特殊字段:begin 和 end,begin用於在主輸入迴圈(讀輸入檔案)之前執行,end用於在主輸入之後執行。

二、awk幾種簡單的用法

注:input是乙個ascii檔案,其中包含三個空行

(1)~~~>awk '/^$/ input

~~~>there is a 空行.

~~~>there is a 空行.

~~~>there is a 空行.

(2)通過指令碼(編寫awk命令)

建立comman.awk指令碼檔案,內容為:

/^$/

然後執行命令

~~~>awk -f comman.awk input

~~~>there is a 空行.

~~~>there is a 空行.

~~~>there is a 空行.

(3)通過純指令碼

建立src.awk指令碼檔案,內容為:

#!/bin/awk -f

/^$/

然後直接執行指令碼檔案,輸出結果同上

三、記錄和域

記錄:awk輸入檔案行

域:記錄中的每個字串(域之間用空格、tab鍵或其他符號進行分隔)(分隔符)

~~~>awk '' input

~~~>awk -f"," ' input

~~~>awk -f"\t" ' input

~~~>awk 'begin $1~/root/' /etc/passwd

~~~>awk 'begin ' input

注:$0 表示所有域,$n 表示第n個域

四、awk環境變數及其意義

變數名 意義

$n 當前記錄的第n個域,域間由fs分割

$0 記錄的所有域

argc 命令列引數的數量

argind 命令列中當前檔案的位置(以0開始標號)

argv 命令列引數的陣列

convfmt 數字轉換格式

environ 環境變數關聯陣列

errno 最後乙個系統錯誤的描述

filedwidths 字段寬度列表,以空格鍵分隔

filename 當前檔名

fnr 瀏覽檔案的記錄數

fs 字段分隔符,預設是空格鍵

ignorecase 布林變數,如果為真則進行忽略大小寫的匹配

nf 當前記錄中的域數量

nr 當前記錄數

ofmt 數字的輸出格式

ofs 輸出域分隔符,預設是空格符

ors 輸出記錄分隔符,預設是換行符

rlength 由match函式所匹配的字串長度

rs 記錄分隔符,預設是空格鍵

rstart 由match函式所匹配的字串的第1個位置

subsep 陣列下標分隔符,預設值是\034

五、格式化輸出

printf(格式控制符,引數)

printf修飾符:

printf("%-15s",$1) 輸出字串,左對齊,長度為15

printf(".3f",2009.1012) 浮點數長度控制在10位、小數點後保留3位

printf("%.3f",2009.1012)

printf格式符及其意義:

%c ascii字元

%d 整型數

%e 浮點數,科學計數法

%f 浮點數

%o 八進位制數

%s 字串

%x 十六進製制數

六、內建字串函式及其意義

函式名 意義

gsub(r,s) 在輸入檔案中用s替換r

gsub(r,s,t) 在t中用s替換r

index(s,t) 返回s中字串第乙個t的位置

length(s) 返回s的長度

match(s,t) 測試s是否包含匹配t的字串

split(r,s,t) 在t上將r分成序列s

sub(r,s,t) 將t中第1次出現的r替換為s

substr(r,s) 返回字串r中從s開始的字尾部分

substr(r,s,t) 返回字串r中從s開始長度為t的字尾部分 例:

~~~>awk 'begin gsub(/root/,"teisei",$1) ' /etc/passwd

~~~>awk 'begin gsub(/root/,"teisei") ' /etc/passwd

~~~>awk 'begin '

~~~>awk 'begin '

~~~>awk 'begin '

~~~>awk 'begin '

~~~>awk 'begin '

~~~>awk 'begin ' input

~~~>awk 'begin '

~~~>awk 'begin '

注:split在後面結合陣列進行介紹

七、向awk指令碼傳遞引數

awk 指令碼 parameter=value 輸入檔案(等號兩端不能有空格)

awk 'begin ' ofs="." input

注意:awk命令列引數不能被begin欄位語句訪問,換句話說直到輸入檔案的第1行被讀取時,命令列引數方才生效

八、條件語句和迴圈語句

(語法和c語言完全一樣)

(1)if(條件表示式)

動作1[else

動作2]

(2)if(x~/[hh]el?o/) print x

(3)while(條件表示式) 動作

(4)do 動作

while(條件表示式)

(5)for(設計計數器初值;測試計數器;計數器變化) 動作

九、陣列

基本格式:array[index]=value

1.關聯陣列:

關聯陣列的值無需以連續的位址進行儲存,awk自動維護了一對值:索引和陣列元素值。awk的所有陣列都是關聯陣列。

~~~>awk 'begin'

(convfmt=「%d」字元轉換格式為整型,10.15-->10,data[10]不存在,data[10.15]存在)

基於上述關聯陣列的含義,awk特別定義了一種for迴圈用來訪問關聯陣列:

for(variable in array)

do something with array[variable]

關鍵字in也可以用在條件表示式中判斷元素是否存在陣列中,條件表示式格式為:

index in array

如果array[index]存在,則返回1,否則返回0。

~~~>awk '

~~~>begin '

~~~found element!

2.split函式

split(r,s,t)函式將字串以t為分割符,將r字串拆分為字串陣列,並存放在t中。返回值是陣列的大小。

~~~>awk 'begin '

~~~3

~~~>awk 'begin ' input

~~~2

~~~2

~~~2

下面看看split函式所生成的陣列內容,新建名為array.awk的指令碼檔案,內容如下:

#!/bin/awk -f

begin

執行指令碼

~~~>chmod 744 array.awk

~~~>./array.awk input

在split函式分割第1號域之後,利用for迴圈將name陣列的內容列印出來。

3.陣列形式的系統變數

awk系統變數中有兩個變數是以陣列形式提供的:argv和environ。argc是argv陣列中元素的個數,與c語言一樣,從argv[0]開始到argv[argc-1]結束。

(1)argv

例1:新建指令碼檔案argv.awk內容如下:

#argv演示argv中儲存了哪些命令列引數

begin

執行:~~~>awk -f argv.awk xyz n=99 "hello world"

例2:對input檔案中的**號碼進行檢索,即輸入姓名,系統響應輸出其**號碼。新建名為findphone的指令碼:

#例2#!/bin/awk -f

begin

else }

}$1~name  

(2)environ變數儲存了linux作業系統的環境變數

例:列印出當前系統所有的環境變數,其結果類似linux的set命令

~~~>awk '

~~~>begin '

environ的索引是環境變數名,因此可以通過環境變數名來直接得到其值:

environ["user"]

environ["awkpath"]

當然也可以修改環境變數值

environ["gridsim"]=/bin.gawk

注意:環境變數名需要用雙引號引起

awk 程式設計

形式 awk options code filename 比如 awk f a filename 這裡用字元 a作為行分隔符,預設是空格 awk fmyscript awk filename in 如果 code 部分太長,或者要重用,可以寫成 awk指令碼 裡可以分成3部分。begin 條件 en...

awk程式設計

awk是linux 系統下的乙個強大的文字處理工具,常常和sed grep一起配合使用。主要功能就是將文字依行讀取,然後每行按照一定的分隔符隔開放進乙個array裡面並提供了函式對這些元素進行一定的處理分析。在awk中,檔案的每一行由域分隔符分開,每一項稱為乙個域。在不指明 f域分隔符的情況下,預設...

awk程式設計

2017年1月10日,星期二 awk awk是乙個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。awk 案例 顯示最近登入的5個帳號 last n 5 awk 讀入有 n 換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域 0則表...