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