linux之awk敕令的用法。本站提示廣大學習愛好者:(linux之awk敕令的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是linux之awk敕令的用法正文
先來一個例子:
文件a,統計文件a的第一列中是浮點數的行的浮點數的均勻值。用awk來完成只須要一句話便可以弄定
$cat a
1.021 33
1#.ll 44
2.53 6
ss 7
awk 'BEGIN{total = 0;len = 0} {if($1~/^[0-9]+\.[0-9]*/){total += $1; len++}} END{print total/len}' a
(剖析:$1~/^[0-9]+\.[0-9]*/表現$1與“/ /”外面的正則表達式停止婚配,若婚配,則total加上$1,且len自增,即數量加1.“^[0-9]+\.[0-9]*”是個正則表達式,“^[0-9]”表現以數字開首,“\.”是本義的意思,表現“.”為小數點的意思。“[0-9]*”表現0個或多個數字)
awk的普通語法格局為:
awk [-參數 變量] 'BEGIN{初始化}前提類型1{舉措1}前提類型2{舉措2}。。。。END{後處置}'
個中:BEGIN和END中的語句分離在開端讀取文件(in_file)之前和讀取完文件以後施展感化,可以懂得為初始化和收尾。
(1)參數解釋:
-F re:許可awk更改其字段分隔符
-v var=$v 把v值賦值給var,假如有多個變量要賦值,那末就寫多個-v,每一個變量賦值對應一個-v
e.g. 要打印文件a的第num行到num+num1行之間的行,
awk -v num=$num -v num1=$num1 'NR==num,NR==num+num1{print}' a
-f progfile:許可awk挪用並履行progfile法式文件,固然progfile必需是一個相符awk語法的法式文件。
(2)awk內置變量:
ARGC 敕令行參數的個數
ARGV 敕令行參數數組
ARGIND 以後被處置文件的ARGV標記符
e.g 有兩個文件a 和b
awk '{if(ARGIND==1){print "處置a文件"} if(ARGIND==2){print "處置b文件"}}' a b
文件處置的次序是先掃描完a文件,再掃描b文件
NR 曾經讀出的記載數
FNR 以後文件的記載數
下面的例子也能夠寫成如許:
awk 'NR==FNR{print "處置文件a"} NR > FNR{print "處置文件b"}' a b
輸出文件a和b,因為先掃描a,所以掃描a的時刻必定有NR==FNR,然後掃描b的時刻,FNR從1開端計數,而NR則接著a的行數持續計數,所以NR > FNR
e.g 要顯示文件的第10行至第15行
awk 'NR==10,NR==15{print}' a
FS 輸出字段分隔符(缺省為:space:),相當於-F選項
awk -F ':' '{print}' a 和 awk 'BEGIN{FS=":"}{print}' a 是一樣的
OFS輸入字段分隔符(缺省為:space:)
awk -F ':' 'BEGIN{OFS=";"}{print $1,$2,$3}' b
假如cat b為
1:2:3
4:5:6
那末把OFS設置成";"後就會輸入
1;2;3
4;5;6
(小正文:awk把朋分後的第1、2、3個字段用$1,$2,$3...表現,$0表現全部記載(普通就是一整行))
NF:以後記載中的字段個數
awk -F ':' '{print NF}' b的輸入為
3
3
注解b的每行用分隔符":"朋分後都3個字段
可以用NF來掌握輸入相符請求的字段數的行,如許可以處置失落一些異常的行
awk -F ':' '{if (NF == 3)print}' b
RS:輸出記載分隔符,缺省為"\n"
缺省情形下,awk把一行看做一個記載;假如設置了RS,那末awk依照RS來朋分記載
例如,假如文件c,cat c為
hello world; I want to go swimming tomorrow;hiahia
運轉 awk 'BEGIN{ RS = ";" } {print}' c 的成果為
hello world
I want to go swimming tomorrow
hiahia
公道的應用RS和FS可使得awk處置更多形式的文檔,例如可以一次處置多行,例如文檔d cat d的輸入為
1 2
3 4 5
6 7
8 9 10
11 12
hello
每一個記載應用空行朋分,每一個字段應用換行符朋分,如許的awk也很好寫
awk 'BEGIN{ FS = "\n"; RS = ""} {print NF}' d 輸入
2
3
1
ORS:輸入記載分隔符,缺省為換行符,掌握每一個print語句後的輸入符號
awk 'BEGIN{ FS = "\n"; RS = ""; ORS = ";"} {print NF}' d 輸入
2;3;1
(3)awk讀取shell中的變量
可使用-v選項完成功效
$b=1
$cat f
apple
$awk -v var=$b '{print var, $var}' f
1 apple
至於有無方法把awk中的變量傳給shell呢,這個成績我是如許懂得的。shell挪用awk現實上是fork一個子過程出來,而子過程是沒法向父過程傳遞變量的,除非用重定向(包含管道)
a=$(awk '{print $b, '$b'}' f)
$echo $a
apple 1
(4)輸入重定向
awk的輸入重定向相似於shell的重定向。重定向的目的文件名必需用雙引號援用起來。
$awk '$4 >=70 {print $1,$2 > "destfile" }' filename
$awk '$4 >=70 {print $1,$2 >> "destfile" }' filename
(5)awk中挪用shell敕令:
1)應用管道
awk中的管道概念和shell的管道相似,都是應用"|"符號。假如在awk法式中翻開了管道,必需先封閉該管道能力翻開另外一個管道。也就是說一次只能翻開一個管道。shell敕令必需被雙引號援用起來。“假如盤算再次在awk法式中應用某個文件或管道停止讀寫,則能夠要先封閉法式,由於個中的管道會堅持翻開狀況直至劇本運轉停止。留意,管道一旦被翻開,就會堅持翻開狀況直至awk加入。是以END塊中的語句也會收到管道的影響。(可以在END的第一行封閉管道)”
awk中應用管道有兩種語法,分離是:
awk output | shell input
shell output | awk input
關於awk output | shell input來講,shell吸收awk的輸入,並停止處置。須要留意的是,awk的output是先緩存在pipe中,等輸入終了後再挪用shell敕令 處置,shell敕令只處置一次,並且處置的機會是“awk法式停止時,或許管道封閉時(須要顯式的封閉管道)”
$awk '/west/{count++} {printf "%s %s\t\t%-15s\n", $3,$4,$1 | "sort +1"} END{close "sort +1"; printf "The number of sales pers in the western"; printf "region is " count "." }' datafile (說明:/west/{count++}表現與“wes”t停止婚配,若婚配,則count自增)
printf函數用於將輸入格局化並發送給管道。一切輸入集齊後,被一同發送給sort敕令。必需用與翻開時完整雷同的敕令來封閉管道(sort +1),不然END塊中的語句將與後面的輸入一路被排序。此處的sort敕令只履行一次。
在shell output | awk input中awk的input只能是getline函數。shell履行的成果緩存於pipe中,再傳送給awk處置,假如有多行數據,awk的getline敕令能夠挪用屢次。
$awk 'BEGIN{ while(("ls" | getline d) > 0) print d}' f