shell語句記錄-awk

 cat ./daily_uv/daily_uv_20140104 | awk '{fr[$1]+=$3; k=$1 "_" $2; av[k]+=$3;} END{for (k in fr) {print k,fr[k]} for (k in av) {print k,av[k]}}' android

 

1.  最基本的用法bash

awk '{print $1}' ./daily_messageEnter_uv/daily_messageEnter_uv_20131226spa

即 awk '{*****}' filenamecode

 

2.  awk的格式化輸出,和C語言的printf沒什麼兩樣ip

如awk '{printf "%s %s", $1,$2}' ./filenameci

注意!!!字符串

此時輸出的效果與awk '{print $1}' 不一樣,1中的print會自動換行,但這裏的printf若是不指定的話是連着輸出的,輸出方式:輸出第一列的第一行,第二列的第一行,而後是第一列的第二行,第二列的第二行 ………………string

若是但願換行,那麼:加上\nio

即awk '{printf "%s %s\n", $1,$2}' ./filenametable

也能夠加上\t等

 

3.  過濾記錄

awk '$1=="android" && $3>=10000 ' filename
輸出  android 3.4.3 82256 65735
    android 3.2.1 10503 8540
    android 3.3.0 82071 66686
    android 3.4.0 18517 15031

此時四列知足條件的數據都將被輸出(默認狀況)

若是須要輸出指定的數據須要使用前面提到的輸出方法。

$ awk '$1=="android" && $3>=10000 {print $1,$2}  '  filename

此時能夠總結這樣的規律:awk的語句是寫在'***' 中的,{**}中寫輸出的內容,語句中間沒有符號,順着向後寫便可

注意!!!!

$1=="android" 這裏的字符串須要用雙引號

  3.1  輸出行號

  awk '$1=="android" && $3>=10000 {print NR,$1,$2}’ filename

 

4.  指定分隔符

 awk -F ’;‘ '{print NR,$1,$2}‘

-F能夠指定分隔符,默認是Tab或是空格

 

  4.1  內建變量

  awk的一些內建變量:

$0 當前記錄(這個變量中存放着整個行的內容)
$1~$n 當前記錄的第n個字段,字段間由FS分隔
FS 輸入字段分隔符 默認是空格或Tab
NF 當前記錄中的字段個數,就是有多少列
NR 已經讀出的記錄數,就是行號,從1開始,若是有多個文件話,這個值也是不斷累加中。
FNR 當前記錄數,與NR不一樣的是,這個值會是各個文件本身的行號
RS 輸入的記錄分隔符, 默認爲換行符
OFS 輸出字段分隔符, 默認也是空格
ORS 輸出的記錄分隔符,默認爲換行符
FILENAME 當前輸入文件的名字

若是是多個分隔符能夠寫成

awk -F '[,;]'

指定輸出分隔符 awk -F OFS="\t" '{print $1}'   filename

 

5.  字符串匹配

awk '$1 ~ /an.*|ipad/ {print $0}'    filename

‘|’符號的左右不要隨意添加空格

awk '$1 ~ /an.*|ipad/ || NR==1 {print $0}'    filename

即輸出表頭

awk能夠像grep同樣的去匹配第一行,就像這樣:

awk '/ipad/' filename

模式取反的例子:

awk '$1 !~ /an.*|ipad/ {print $0}'  filename

相關文章
相關標籤/搜索