在Linux中递归执行zgrep

时间:2009-09-01 22:54:59

标签: linux perl grep

这个zgrep命令在1989年2月26日24小时内输入一个巨大的输入日志文件时输出一行包含单词yellow的特定字段。

zgrep 'yellow' /color_logs/1989/02/26/*/1989-02-26-00_* | cut -f3 -d'+' 

1)我更喜欢使用perl脚本。使用bash脚本有什么好处吗?

此外,在编写此脚本时,我希望它能够在处理每天的数据后创建一个文件(因此它会查看一天中的所有小时)

zgrep 'yellow' /color_logs/1989/02/*/*/1989-02-26-00_* | cut -f3 -d'+' 

2)在处理了一天的数据之后,如何确定第一个星(在Perl中)的值,以便我可以在其名称中输出YYMMDD的文件。我有兴趣从这个问题的正上方的代码行中获取第一颗星的值。

1 个答案:

答案 0 :(得分:1)

Grep写出了该行所在的文件,但是你的剪切命令正在抛弃它。你可以这样做:

open(PROCESS, "zgrep 'yellow' /color_logs/1989/02/*/*/1989-02-26_* |");
while(<PROCESS>) {
    if (m!/color_logs/(\d\d\d\d)/(\d\d)/(\d\d)/[^:]+:(.+)$!) {
        my ($year, $month, $day, $data) = ($1, $2, $3, $4);
        # Do the cut -f3 -d'+' on the line from the log
        my $data = (split('+', $data))[2];
        open(OUTFILE, ">>${year}${month}${day}.log");
        print OUTFILE $data, "\n";
        close(OUTFILE);
    }
}

因为你打开和关闭每一行的文件效率很低,你可以使用IO :: File对象而只在日期改变时打开,但你明白了。