1.awk介紹
linux文本處理三劍客:
1.grep,egrep:文本過濾
2.sed:行編輯器
3.awk報表生成器,格式化文本輸出
linux中把awk連結到了gawk,使用的是gnu項目中的awk。
awk工作模式,讀取一行文本,利用内置或者指定的字段分隔符去分隔這行文本,把每字段指派給内置的位置變量,如第一段$1,第二段$2……整行可以指派$0然後引用。
awk是一種程式設計語言,用于在linux下對文本和資料進行處理。資料可以來自标準輸入、一個或多個檔案,或其它指令的輸出。它支援使用者自定義函數和動态正規表達式等先進功能,是linux下的一個強大程式設計工具。它在指令行中使用,但更多是作為腳本來使用。
2.awk基本文法和選項
gawk[options]’program’file file…… program:pattern(模式){action(處理動作)statement(輸出字段)},由語句組成,語句之間由分号分隔
-f[]:指定輸入字段的分隔符 -v var=val:變量指派
print item…. 注意: 1.item之間用逗号分隔,而輸出時使用輸出分隔符 2.輸出各item可以是字元串或者數值,也可以目前文本的字段($n),變量或者awk的表達式;數值會被隐式轉換成字元輸出。 3.print後面的item如果省略,輸出整行資訊
2.4.1.printf format item…… 1.format是必須的 2.不會自動換行,需指定 3.format要給每個item指定一個格式符 2.4.2.格式符以%開頭,後面跟一個字元 %c:顯示字元的ascii碼 %d,%i:顯示十進制整數 %e,%e:科學計數法顯示數值 %f:顯示浮點數 %g,%g:以科學計數法格式或浮點數格式顯示數值 %s:字元串 %u:無字元的整數 %%:顯示%自身 2.4.3修飾符 #[.#]第一個數字顯示寬度如:%5s 第二個數字顯示精度如 :%5.4s -:左對齊 +:顯示數值符号 2.4.4操作符 算數操作符 + – * / ^ %:加 減 乘 除 次方 取餘 字元串操作符:字元串連接配接 指派操作符: =,+= ,–= 比較操作符:> >= < <= == != 模式比對符:~ !~ 邏輯操作符:&& || 條件表達式:selector?if-true-expression:if-false-expression 函數調用: functiong_name()
1)/regular expression/:僅處理能被/regular expression/比對到的行 2)relational expression:關系表達式 3)line ranges:行範圍,類似sed或者vim的位址定界 4)begin/end:在運作awk運作程式之前運作一次begin;在運作awk完之後執行一次end 5)empty:空模式,比對任意行
1)表達式 a)if-else文法,通常對行或者行中的字段做條件判斷 if(條件)statement[else statement] if(條件){statement;} [else {statement;}]花括号内能有多個語句,用分号分隔。 b)while循環,通常在目前行各字段間循環 while(條件)statement while(條件){statement;} c)do-while循環 do statement while (condition) d)for循環 for(expr1:….) {statement;} e)gawk有對switch語句的支援 f)break,continue break退出目前循環 continue提前結束本輪循環,進入下輪循環 g)next提前結束對本行的處理,進入下行 3)複合表達式 4)輸入語句 5)輸出語句
3.awk的變量
fs:字段分隔符,預設是空格 rs:記錄分隔符,預設為換行符 ofs:輸出字段分隔符,預設是空格 ors:輸出記錄分隔符,預設換行符 nf:目前記錄的字段數 nr:目前行數,所有檔案一起計數
fnr:每個檔案的行數 filename:目前檔案名 argc:指令行的參數個數 argv:指令行的數組,儲存awk和他的參數
3.2自定義變量
-v var=val 變量區分大小寫 1)可以在programe中定義 2)可以用-v 定義
關聯數組:array[index-expression]
index-expression:
可以使用任意字元串;
如果某數組元素實作不存在,在引用時,awk會自動建立此元素并将其值初始化為空串:是以,若要判斷數組是否存在某元素,要使用“index in array”進行;
例如:a[mon]=“monday”
for循環在awk中有一個專用于周遊數組元素
文法:for(var in array){for-body}
var會周遊array的每一個索引,print array[var]
5.1内置函數
rand():傳回0和1之間的随機數
length([s]):字元串的長度
gsub(r,s [,t])以r模式查找t代表的字元串,将其替換成s表示的字元串
sub(r,s [,t])以r模式查找t代表的字元串,将其第一次比對替換成s表示的字元串
split(s,a[,r]):以r為分隔符切割s字元串,結果儲存在a代表的數組中,split函數的傳回值是切割成的字段數。
substr(s,i[,n]):從s字元串取子串,從i開始,取n個字元
systime:取時間戳;
and(v1,v2)
5.2自定義函數
function f-name (p,q)
{
}