如何使用shell按行过滤文件?

时间:2016-04-25 13:10:23

标签: shell

我有一个像bellow一样的日志文件:

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

输出应该是:

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

每行前面的数字是此网址被调用的数字。现在我想要计算每个url(没有获取http请求的params)被请求的次数,例如,如上所述我只想计算' /repay/query_need_repay_data.action'网址被称为。现在我使用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);
            }
        }
    }

提前致谢。

1 个答案:

答案 0 :(得分:3)

awk救援!

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

14341 /repay/query_need_repay_data.action