将具有相似文本的行打印在一起

CKi*_*ing 2 shell-script text-processing sort

我目前正在分析应用程序的性能。我首先查看应用程序生成的日志,并确定执行时间超过可接受时间的业务逻辑任务。

日志文件中的一个片段看起来像:

2014-07-02 18:03:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:05:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35162 processed
2014-07-02 18:15:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35164 processed
2014-07-02 18:20:20,269 INFO  [ROOT] - Task2. xmlRecord Id :35165 processed
Run Code Online (Sandbox Code Playgroud)

我的要求是找出执行每个任务所花费的总时间。例如,xmlRecord 的 Task2 花费的时间为 35165 = xmlRecord 的 Task 2 的结束时间 35165 - xmlRecord 的 Task 1 的结束时间 35165。

出于这个原因,我想要一种将具有相同 xmlRecord Id 的所有日志语句分组在一起的方法,如下所示:

2014-07-02 18:03:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:20:20,269 INFO  [ROOT] - Task2. xmlRecord Id :35165 processed
2014-07-02 18:05:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35162 processed
2014-07-02 18:15:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35164 processed
Run Code Online (Sandbox Code Playgroud)

如果我可以将所有日志语句如上所示分组,我很快就能看到 Task2 花了 17 分钟来处理 xmlRecord 35165。

请注意,我在此处显示的日志并不是我的应用程序打印的确切日志,而只是一个示例。我希望能够对所有日志语句进行分组,以便特定 XML id 的日志始终一个接一个。

我对外壳有点生疏,如果有人能指出我已经这样做的单衬或脚本,我将不胜感激,这样我就不会浪费时间重新发明轮子。

gar*_*Red 5

作为初学者,为什么不在xmlRecord Id列上排序?:-

sort -k 9 -o <out.log> <in.log>
Run Code Online (Sandbox Code Playgroud)

这应该按数字顺序将它们组合在一起。如果您也想排序Task,那么它可能会涉及awk脚本或类似内容。

这是如何工作的

sort命令可以通过多种方式对数据进行排序,在本例中,我们将根据第 9 列中的值对其进行排序。除非另有指示,否则它将使用标准的字母数字排序。

.... -k 9 ....
Run Code Online (Sandbox Code Playgroud)

示例中的其他参数只是指定要使用的输入文件(您的日志文件)和一个将结果输出到的新文件,-o <out.log>