Linux下利用awk進(jìn)行文本統(tǒng)計
最近做了許多日志文件的統(tǒng)計工作,發(fā)現(xiàn)awk這個東西用來處理文本真是太強大了,結(jié)合sed和sort命令應(yīng)付日常的文本統(tǒng)計工作非常之方便 ,下面是我這段時間對awk的學(xué)習(xí)理解和常用的命令:
1. awk的命令格式:
awk命令是由模式和操作組成的(兩者是可選的):
pattern {action} 如awk $1~/(\.jpg|\.gif)$/' access.log,或awk 'length($1) < 10' click.log。
如果沒有模式,則action應(yīng)用到全部記錄,
如果沒有模式,則action應(yīng)用到全部記錄,
如果沒有action,則輸出匹配模式的全部記錄。
默認(rèn)情況下,每一個輸入行都是一條記錄,但我們可以通過RS變量指定不同的行分隔符進(jìn)行一行的定義。
1.1 模式,可以是正則表達(dá)式,也可以是關(guān)系表達(dá)式,在表達(dá)式前面用~和~!分別表示匹配和不匹配后面的模式
BEGIN:指定在第一條記錄被處理之前所進(jìn)行的工作
END:指定在最后一條記錄被處理之后所進(jìn)行的工作
1.2 操作,由一個或多個命令、函數(shù)、表達(dá)式組成,操作需要用大括號{}包含,這里面就是對文本要進(jìn)行處理的邏輯
2. awk的環(huán)境變量(常用):
$0 完整的一行記錄
$n 當(dāng)前記錄的第n個字段
ARGV 命令行參數(shù)數(shù)組
FS 字段分隔符,默認(rèn)是空格或tab,可以自己指定
NR 當(dāng)前記錄數(shù)
NF 當(dāng)前記錄的字段數(shù)
RS 一行記錄的分隔符,默認(rèn)是換行符
3. 文本處理常用命令:
3.1 所有第1列相同的行,按第2列的和,求和的結(jié)果倒序輸出(類似SQL中的group by求sum())
awk '{arr[$1]+=$2}END{for (i in arr) print i,arr[i]}' src.txt | sort -k2nr -g > dest.txt
3.2 文件分割,每100萬行分成一個文件
awk '{if (NR<1000000) print $0 >"file01";if (NR>=1000000) print $0>"file02"}' src.txt
當(dāng)然,分割文件還有一個更方便的工具split,split -b1000m src.txt output_prefix (按大小來分割)
3.4 統(tǒng)計第一列的值出現(xiàn)的次數(shù),結(jié)果倒序輸出(類似SQL中的group by求count())
awk -F "," '{ w[$1]+=1} END{ for (a in w) print a, w[a]}' src.txt > dest.txt
3.5 刪除重復(fù)的行
awk '!a[$0]++' src.txt > dest.txt (也可以指定$x來刪除第x列重復(fù)的行)
3.6 字符串連接
awk 'length($1) > 0 {var="insert into user_info values("$1")";print var}' src.txt > dest.sql
3.7 比較兩列
awk '{max = {$1 > $3} ? $1: $3: print max}' src.txt
以上就是一些常用的awk命令,主要是用于文本的統(tǒng)計,另外,awk還內(nèi)置了很多函數(shù),包括時間函數(shù)、數(shù)學(xué)函數(shù)和字符串函數(shù),
可以方便地直接引用。
BEGIN:指定在第一條記錄被處理之前所進(jìn)行的工作
END:指定在最后一條記錄被處理之后所進(jìn)行的工作
1.2 操作,由一個或多個命令、函數(shù)、表達(dá)式組成,操作需要用大括號{}包含,這里面就是對文本要進(jìn)行處理的邏輯
2. awk的環(huán)境變量(常用):
$0 完整的一行記錄
$n 當(dāng)前記錄的第n個字段
ARGV 命令行參數(shù)數(shù)組
FS 字段分隔符,默認(rèn)是空格或tab,可以自己指定
NR 當(dāng)前記錄數(shù)
NF 當(dāng)前記錄的字段數(shù)
RS 一行記錄的分隔符,默認(rèn)是換行符
3. 文本處理常用命令:
3.1 所有第1列相同的行,按第2列的和,求和的結(jié)果倒序輸出(類似SQL中的group by求sum())
awk '{arr[$1]+=$2}END{for (i in arr) print i,arr[i]}' src.txt | sort -k2nr -g > dest.txt
3.2 文件分割,每100萬行分成一個文件
awk '{if (NR<1000000) print $0 >"file01";if (NR>=1000000) print $0>"file02"}' src.txt
當(dāng)然,分割文件還有一個更方便的工具split,split -b1000m src.txt output_prefix (按大小來分割)
3.4 統(tǒng)計第一列的值出現(xiàn)的次數(shù),結(jié)果倒序輸出(類似SQL中的group by求count())
awk -F "," '{ w[$1]+=1} END{ for (a in w) print a, w[a]}' src.txt > dest.txt
3.5 刪除重復(fù)的行
awk '!a[$0]++' src.txt > dest.txt (也可以指定$x來刪除第x列重復(fù)的行)
3.6 字符串連接
awk 'length($1) > 0 {var="insert into user_info values("$1")";print var}' src.txt > dest.sql
3.7 比較兩列
awk '{max = {$1 > $3} ? $1: $3: print max}' src.txt
以上就是一些常用的awk命令,主要是用于文本的統(tǒng)計,另外,awk還內(nèi)置了很多函數(shù),包括時間函數(shù)、數(shù)學(xué)函數(shù)和字符串函數(shù),
可以方便地直接引用。
更詳細(xì)的awk手冊,請參考:http://man.lupaworld.com/content/manage/ringkee/awk.htm
-->槍聲依舊<--
posted on 2012-01-15 17:28 槍聲依舊 閱讀(10314) 評論(0) 編輯 收藏 所屬分類: Linux