2016-04-25 7 views
0

私は怒鳴るようにログファイルをHAVA:シェルを使ってファイルを行単位でフィルタリングする方法は?

5082 //open_api/user/get_user_info 
5074 /user/get_user_idCard_info?passportId=YRD1412538757&viewSource=02 
5029 /user/getuserinfo?passportId=YRD1412538757 
4706 /user/getuserinfo?passportId=YRD1507000030516 
4611 /user/get_user_idCard_info?passportId=YRD1507000030516&viewSource=02 
4040 /salesloan/update_draw_bank 

出力は次のようにする必要があります:各行は、このURLが呼び出される番号である前に

5082 //open_api/user/get_user_info 
9685 /user/get_user_idCard_info 
9735 /user/getuserinfo 
4040 /salesloan/update_draw_bank 

数。今度は、上記のように、 '/repay/query_need_repay_data.action'というURLが呼び出された回数だけカウントしたい場合など、各url(httpリクエストを取得するparamsなし)が何回要求されたかを調べたいと思います。今私は、行をフィルタ処理して処理するためにjavaを使用していますが、200Mバイトのファイルではすでに4時間かかっていますが、どの方法で作業をすばやく行うことができますか?

のJavaコード:事前に

public static void main(String[] args) throws IOException { 
     String source = "/Users/leo/logs/p2pservice/access/a2.output"; 
     String target = "/Users/leo/logs/p2pservice/access/targetUrls"; 
     File targetFile = new File(target); 
     String splinter = "\\?"; 

     List<String> strings = Files.readLines(new File(source), Charsets.UTF_8); 
     for (String string : strings) { 
      if (string.contains("?")) { 
       String[] split = string.split(splinter); 
       Files.append(string.split(splinter)[0].toString() + "\n", targetFile, Charsets.UTF_8); 
      } else { 
       Files.append(string + "\n", targetFile, Charsets.UTF_8); 
      } 
     } 
    } 

感謝。

+0

、それは122333 /repay/query_need_repay_data.action – leo

+0

理由122333のようにすべきですか?私が最初の列を合計すると、私は14Kくらいです。 – fedorqui

+0

はい、あなたは14歳になるはずです、私は数えませんでした。ありがとう。 – leo

答えて

3

awkレスキュー!上記の行のために

$ awk -F'[ ?]' '{a[$2]+=$1} END{for(k in a) print a[k], k}' file 

14341 /repay/query_need_repay_data.action 
関連する問題