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,則輸出匹配模式的全部記錄。
          默認(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ù),
          可以方便地直接引用。
          更詳細(xì)的awk手冊,請參考:http://man.lupaworld.com/content/manage/ringkee/awk.htm

          -->槍聲依舊<--

          posted on 2012-01-15 17:28 槍聲依舊 閱讀(10314) 評論(0)  編輯  收藏 所屬分類: Linux


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2012年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 图们市| 勐海县| 澄迈县| 如皋市| 建昌县| 托克逊县| 广河县| 金坛市| 汤阴县| 迭部县| 崇文区| 南皮县| 永康市| 长兴县| 德庆县| 双峰县| 积石山| 浪卡子县| 浮山县| 大荔县| 施秉县| 邵阳市| 杭锦后旗| 张家港市| 沙河市| 沅陵县| 灵石县| 双牌县| 泊头市| 道孚县| 安达市| 巴塘县| 朝阳市| 武冈市| 静宁县| 成安县| 阿拉善盟| 延寿县| 桐柏县| 湘阴县| 正安县|