我有一个目录(/home/myuser/logs
),其中包含过去5天的以下日志文件:
applogs_20130402.txt
applogs_20130401.txt
applogs_20130331.txt
applogs_20130330.txt
每个“applog”的每一行都有相同的结构,只有不同的数据:
<timestamp> | <fruit> | <color> | <cost>
例如,applogs_20130402.txt
可能如下所示:
23:41:25 | apple | red | 53
23:41:26 | kiwi | brown | 12
23:41:29 | banana | yellow | 1023
... (etc., every line is pipe delimited like this)
我想创建一个“主日志”,它将所有5个日志文件中的所有日志条目(结构化,管道分隔的行)组合到一个文件中,其中所有时间戳都按时间顺序排序。此外,我还需要时间戳中反映的日期。
因此,例如,如果applogs_20130402.txt
和applogs_20130401.txt
是目录中仅有的2个applog,它们分别看起来像这样:
applogs_20130402.txt:
=====================
23:41:25 | apple | red | 53
23:41:26 | kiwi | brown | 12
23:41:29 | banana | yellow | 1023
applogs_20130401.txt:
=====================
23:40:33 | blueberry | blue | 4
23:41:28 | apple | green | 81
23:45:49 | plumb | purple | 284
然后,我想要一个masterlog.txt
文件,如下所示:
2013-04-01 23:40:33 | blueberry | blue | 4
2013-04-01 23:41:28 | apple | green | 81
2013-04-01 23:45:49 | plumb | purple | 284
2013-04-02 23:41:25 | apple | red | 53
2013-04-02 23:41:26 | kiwi | brown | 12
2013-04-02 23:41:29 | banana | yellow | 1023
我在Ubuntu上并且可以访问Bash,python和perl,并且没有使用哪种解决方案。通常我会尝试“最佳尝试”并发布它,但我从来没有处理过在Linux上聚合这样的数据。显然,与上面的示例不同,日志的大小是数千行。所以手动做一切都不是一个选择;-)提前谢谢!
答案 0 :(得分:1)
您可以在命令行中使用Perl和sort,如下所示:
perl -n -e 'printf "%d-%02d-%02d %s", $ARGV =~ m/_(\d{4})(\d\d)(\d\d)/, $_;' *.txt | sort -n
Calling perl
with -n
在您的程序周围包裹while (<>) { }
,在这种情况下是-e ''
中的内容。在其中,我们printf
当前行($_
),在此之前我们将文件名中的日期is stored in $ARGV
放入。我们使用regex来抓取年份,月份和日期,由于printf
的列表上下文,m//
可以方便地返回。
对于这个程序,我们传递文件夹中的所有txt文件。结果通过管道传递给命令行工具排序,它使用-n标志对数字进行排序。
答案 1 :(得分:0)
为了完整起见,这里有一个(g)awk单行程来完成同样的事情:
gawk '{ printf "%s %s\n", gensub(/.+_([0-9]{4})([0-9]{2})([0-9]{2}).+/, "\\1-\\2-\\3", "", FILENAME), $0 }' applogs_* | sort