2013-04-03 41 views
-1

我有一个目录(/home/myuser/logs),它包含以下日志文​​件的最后5天,以获得合计日期时间具有相同的结构,只是不同的数据:猛砸/蟒蛇/ perl的神奇跨越多个日志文件

<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个applogs,他们都分别是这样的:

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

为什么downvote? – IAmYourFaja 2013-04-03 18:48:49

+0

似乎很容易与一些命令行程序,但你有什么尝试?我没有投票,但我会说这是因为你没有包括你的努力。 – squiguy 2013-04-03 18:50:05

+2

如果你在Windows或Linux上,这并不重要。我不是downvoter,但我认为除了描述问题之外还有一点努力不会受到伤害。 – simbabque 2013-04-03 18:50:08

回答

1

你可以在命令行中加上sort像这样使用Perl:

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

Calling perl with -n环绕你的程序,在这种情况下是-e ''的东东while (<>) { }。在这里,我们printf目前的行($_),并在我们的前面,把从文件名称的日期,其中is stored in $ARGV。我们使用regex来获取年,月和日,由于printf的列表上下文,因此可以方便地返回m//

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

+0

谢谢@simbabque(+1) - 当我输入这个命令并敲回车(在终端内)时,我看到一个带有“>”字符的新行,没有任何反应。有任何想法吗?再次感谢! – IAmYourFaja 2013-04-03 19:20:33

+1

由于创建完全限定日期和时间,我认为你可以使用没有'-n'标志的排序,因为它们可以按字母顺序排序。我认为你在$ _之后缺少单引号;和* .txt之前。 – 2013-04-03 19:28:36

+0

再次感谢,但仍然一样。这几乎就像是打开一个“会议”或什么,或者等待我的某种输入...... – IAmYourFaja 2013-04-03 19:30:46

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