http://www.zsythink.net/archives/tag/awk/ 參考 自總結中 centos
awk:逐行處理,默認以"換行符"爲標記,識別每一行 awk基本語法: awk[option]'Pattern{Action}'file 選項 模式 動做 選項:awk -v FS='#' 模式:1 空模式 (空模式會匹配文本中的每一行) 2 關係運算模式 (用到關係運算符:x<y;x!=y;x~/正則/) 3 BEGIN/END模式 (BEGIN模式,表示開始處理文本以前執行的操做,END以後) 4 正則模式 ( awk '/正則/{print $0}' /etc/passwd ) 5 行規範模式 ( awk '/正則/,/正則/{動做}' /etc/passwd )( awk 'NR>1 && NR<5 {print $0}' /etc/passwd ) 動做:awk '{ print $0 }' test1.sh awk '{ print $1 }{ print $2 }' test1.sh 等同於 awk '{ print $1;print$2}' test1.sh 循環語句: 1/if awk '{ if (條件){動做} }' file (若是'if'對應的大括號只有一條命令能夠省略動做的大括號) awk -F ":" '{ if(條件){動做} else{動做} }' file awk '{ if(條件){動做} else if(條件){動做} else{動做}}' file 2/for awk '{ for(初始化;布爾;更新){動做}}' file awk '{ for(變量 in 數組){動做}}' file 3/while awk '{ while(條件){動做}}' file awk 'do{動做}while(條件)' file(do...while和while的區別是do...while不管是否知足條件都會先執行一遍) 跳出循環: continue的做用:跳出當前循環 next的做用:讓awk直接從下一行開始運行;相似continue區別是continue針對'本次循環',而next針對'逐行處理' break的做用:跳出整個循環 exit表示退出當前腳本;當有END模式時,會直接執行END動做再退出 分隔符形式 1:awk -F# 2:awk -v FS='#'(-v 自定義函數) 數組: 1 awk數組的第1個下標是1,能夠本身設置下標從0開始 2 數組元素能夠爲"空",即"空字符串"是存在的,todd[3]="";if(4 in todd){print "exist"} if(下標 in 數組名),判斷數組中是否存在對應元素 {count[$1]++}{for(i in count)} count是數組名,因爲引用的數組不存在,因此會建立下標爲改內容的元素, 且元素值在自加後爲1,當再次遇到該元素時,因爲下標同樣的元素存在且值爲1,故會在1的基礎上自加,這樣就能夠起到計數的功能。 內置函數:算數函數、字符串函數、時間函數、其餘函數等 算數函數:rand(隨機生成值不變0-1),srand(隨機生成值變化0-1),int( int(100*rand())生成1-100隨機整數 ) 字符串函數:gsub(指定範圍內的全局替換),sub(指定範圍內的單次替換,只替換第一次匹配到的字符) length(可使用index函數指定字符位於整個字符串的位置), split函數( split(ts,huan,":"); 動態建立數組) asort函數(根據元素的值進行排序,可是通過asort函數排序事後的數組的下標會被重置) asorti函數(根據下標進行排序,生成新數組) 例: [root@centos68 awk]# awk 'BEGIN{ t["z"]=66;t["q"]=88;t["a"]=3; \ > len=asorti(t,newt); \ > for(i=1;i<=len;i++){print i,newt[i],t[newt[i]]} }' 1 a 3 2 q 88 3 z 66 三元運算符:可代替"if...else語句" 即 條件 ? 結果1 : 結果2 1、在awk中,若是省略了模式對應的動做,當前行知足模式時,默認動做爲打印整行,即{print $0} 2、在awk中,0或者空字符串表示"假",非0值或者非空字符串表示"真" 據此能夠打印出奇偶行 奇:awk 'i=!i' file 偶: awk '!(i=!i)' file