awk學習筆記 1

2021-06-25 21:32:16 字數 3589 閱讀 5326

基本用法

awk [-f fs] [-v var=value] 'program' [--] var=value file(s)

awk [-f fs] [-v var=value] 'begin pattern end' var=value file(s)

awk [-f fs] [-v var=value] -f programfile var=value file(s)

-f選項時用來重新定義預設字段分隔符,且一般慣例將它作為第乙個命令列選項。緊接在-f選項後的fs引數是乙個正規表示式,或是被提供作為下乙個引數。字段分隔符也可設定使用內建變數fs所指定的:awk -f '\t' '{}' files fs="[\f\v]" files 以上面的例子來看:-f選項設定的值,應用到第乙個檔案組,而由fs指定的值,則應用到第二個組。

初始化的-v選項必須放在命令列上直接給定的任何程式之前,它們會在程式啟動之前以及處理任何檔案之前生效。在一命令列程式之後的-v選項會被解釋為乙個檔名(可能是不存在的)。

在命令列上其他地方的初始化會在處理引數時完成,並且會帶上檔名,例如:awk '{}' pass=1 *.tex pass=2 *.tex 處理檔案的列表兩次,第一次pass設為1,第二次將它設為2。使用字串值進行初始化無須用引號框起來,除非shell要求這樣的引用,以保護特殊字元或空白。

-- 是特殊選項,指出awk本身已沒有更進一步的命令列選項,任何接下來的選項都能被你的程式使用。

特殊檔名-(連字型大小)表示標準輸入。大部分現代的awk實現(但不包括posix)都認定特殊名稱/dev/stdin為標準輸入,即使主機作業系統不支援該檔名。同樣:/dev/stderr與/dev/stdout可用於awk程式內,分別表示標準錯誤輸出與標準輸出。

變數定義

有三種型別的變數,包括有普通變數、內建變數、字段變數,其中只有普通變數是需要定義的,內建變數和字段變數都是awk在處理檔案時內部設定的,不需要定義。普通變數在定義時遵循c語言的規則,即只能由字母、數字、下劃線組成,而且變數開頭只能是字母和下劃線。與c語言不同的是,定義變數時不需要指定型別,由系統根據變數使用時的上下文去判斷,未經初始化的變數值為0或"",數值型變數直接使用=賦值即可,字串則需要把值用""包裹起來。比如:num=238.5,num="五"。

數值型變數和字串變數之間可以互換,使用如下的方法。字串轉為數字:num + 0 ,數字轉為字串:num + ""。必要時,awk會將字元型變數轉換為數值型變數,或者反向轉換。對變數賦值使用awk的賦值運算子,= += -= /= *= %= ^=  。

字段變數可以和普通變數一樣使用,唯一的區別是他們引用了字段,新的字段可以使用賦值來建立。字段變數引用的字段如果沒有值,則被賦值為空串。欄位的值發生變化時,awk會以ofs的值作為字段分隔符重新計算$0變數的值。字段數目通常被限制在100以內。

內建變數

argc            argc表示命令行中傳入awk指令碼的引數個數,至少乙個(awk命令本身。

argv            argv是argc的引數排列陣列,其中每一元素表示為argv[n],n為期望訪問的命令列引數,0是特殊值,表示awk命令本身。

environ      environ支援系統設定的環境變數,要訪問單獨變數,使用實際變數名,例如environ["editor"]="vi"。

filename    filename支援awk指令碼實際操作的輸入檔案。因為awk可以同時處理許多檔案,因此如果訪問了這個變數,將告之系統目前正在瀏覽的實際檔案。

fnr                fnr支援awk目前操作的記錄數。其變數值小於等於nr。如果指令碼正在訪問許多檔案,每一新輸入檔案都將重新設定此變數。

fs                   fs用來在awk中設定域分隔符,與命令列中-f選項功能相同。預設情況下為空格。如果用逗號來作域分隔符,設定fs=","。

nf                   nf支援記錄域個數,在記錄被讀之後再設定。

nr                   已讀的記錄數

ofs                ofs允許指定輸出域分隔符,預設為空格。如果想設定為#,寫入ofs="#"。

ors                ors為輸出記錄分隔符,預設為新行(\n)。

rs                   rs是記錄分隔符,預設為新行(\n)。

變數傳遞(與shell變數互動)

awk的-v開關指出將要設定乙個變數,緊接著-v開關的是將在awk中賦值的變數。

為了列印第3個字段值,我們可以使用以下的語句:

count=3

echo"a,b,c"|awk-v num=$count''

-v開關是對變數賦值的乙個較新的選項,在要求可移植性的時候,它可能不是理想的選擇。在這種情況下,就需要下面的技巧。

count=3

echo"a,b,c"|awk''num=$count

在awk指令碼中可以使用這些變數,就好像是他們在指令碼中生成的一樣。注意,如果命令列中filename的位置在變數之前,這些變數將不能在begin語句中使用。

關聯陣列

陣列在awk中稱為關聯陣列,因為它的下標既可以是數字也可以是字串。下標通常又稱作鍵(key),並且與對應的陣列元素的值相關聯。陣列元素的鍵和值都儲存在awk程式內部的乙個表中,該錶採用的是雜湊演算法。正是由於使用了雜湊演算法,所以陣列元素不是順序儲存的,如果將陣列的內容顯示出來,元素的排列順序也許跟想象中的不一樣。和變數一樣,陣列也是被用到時才被建立,而且,awk還能判定這個陣列用於儲存數字還是字串。根據使用時的上下文環境,陣列元素被建立為數字0或空字串。陣列的大小不需要宣告。

特殊for迴圈

當下標為字串或非連續的數字時,不能用for迴圈來遍歷陣列。這時候就要使用特殊for迴圈。特殊for迴圈把下標作為鍵來查詢與之關聯的值。

for(item in arrayname)
用字串作為陣列下標

陣列下標可以由單個字元或字串的變數組成,如果是字串,則必須使用雙引號引起來。

count["2"]++
使用欄位的值作為陣列下標

任何表示式都可以用作陣列的下標。所以,也可以用字段作下標。

count[$2]++
陣列與split函式

awk的內建函式split能夠將字串拆分為詞,然後儲存在陣列中。您可以指定字段分隔符,也可以使用fs的當前值。

split(字串,陣列,字段分隔符)

split(字串,陣列)

split("3/15/2004",date,"/")

陣列與delete函式

delete函式用於刪除陣列元素。

awk'end'filename

awk學習筆記(1)

學習文件 類似 f 這個結束選項的處理,如果還有其他部分,視為awk程式 不容許命令列引數 var value are disallowed.選項更安全 i source file include source file 從source file中讀取awk源庫 這個選項完全等效使用 include...

awk學習筆記

單詞計數 cat filename awk end 排序演算法 bin bash function f while n 1 do f 1 shift done wait 顯示特殊符 var i am a student echo var awk 結果為 am a i student echo var...

awk學習筆記

1 將第一列重複的元素去掉,只保留第乙個 root centos awk test cat sed u.txt haha 1 nihao 1 haha 3 hehe 4 heihei 5 heihei 6 1 haha 1 heihei root centos awk test awk f a 1 ...