-1

我有一个目录 ( /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.txtapplogs_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 上处理过这样的聚合数据。显然,与我上面的示例不同,日志有数千行。所以手动做所有事情都不是一种选择;-) 提前致谢!

4

2 回答 2

1

您可以在命令行中使用 Perl 以及如下排序

perl -n -e 'printf "%d-%02d-%02d %s", $ARGV =~ m/_(\d{4})(\d\d)(\d\d)/, $_;' *.txt | sort -n

调用perlwith-n包裹while (<>) { }你的程序,在本例中是-e ''. 在其中,我们printf是当前行 ( $_),并在前面放置来自文件名的日期,该文件名存储在$ARGV. 我们使用正则表达式来获取年、月和日,m//由于来自printf.

对于这个程序,我们传递文件夹中的所有 txt 文件。结果通过管道传送到命令行工具 sort,该工具使用 -n 标志对行进行数字排序。

于 2013-04-03T19:05:32.010 回答
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
于 2013-04-04T11:04:25.140 回答