基本用法
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 ...