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