【问题标题】:Sort log file by a key=value field using command line使用命令行按 key=value 字段对日志文件进行排序
【发布时间】:2018-09-12 06:43:26
【问题描述】:

我有几千兆字节的日志,我正在尝试跟踪给定方法的最差执行时间,所以我使用 grep 来过滤重要的行

$ grep "m=a" /var/log/syslog* 
Sep 12 05:14:00 host1[716]: 2018-09-12 05:14:00.076 [MessageBroker-2] INF 1 com.acme m=a h_status=success, h_time=51, msg=some message
Sep 11 20:00:00 host1[716]: 2018-09-11 20:00:00.389 [MessageBroker-2] INF 1 com.acme m=a h_status=success, h_time=54, msg=some message
Sep 12 04:42:00 host1[716]: 2018-09-12 04:42:00.682 [MessageBroker-2] INF 1 com.acme m=a h_status=success, h_time=77, msg=some message
Sep 12 05:15:02 host1[716]: 2018-09-12 05:15:02.536 [Test worker    ] INF 2 com.acme m=a h_status=success, h_time=8, msg=some message

现在我想按 desc 顺序对该文件进行排序,以获得具有最高 h_time 字段值的行。我尝试使用 sort 来做到这一点,但没有成功,因为我不知道如何提取 h_time 字段值。

我用排序搜索了如何使用自定义分隔符来识别自定义字段,发现thisthis anwser,没有成功。

如何使用一些命令行工具,使用尽可能简单的语法,按 h_time 字段按 desc 顺序对这些行进行排序?

【问题讨论】:

  • 如果您的最终目标只是提取时间最长的几行,您可能不需要对整个 GB 日志文件进行排序,除非您不关心处理时间和/或您的机器足够强大。
  • 根据自定义字段排序适用于您的示例输入 (sort -t, -k2 -Vr log.txt)。所以请从你的日志中提供一些使用sort这种方式会失败的记录
  • @tshiono 在这 GB 的日志中,我用 h_time grep 了,它给了我几千行。对不起,我不够清楚,我想按 h_time 字段对这千行进行排序。当然,我可以使用其他一些外部工具来使用生成的文件进行排序,但我想知道是否可以在命令行中以简单的方式完成
  • 为什么要投反对票,也许我的问题还不够清楚?
  • @oguzismail 非常感谢

标签: linux bash sorting


【解决方案1】:

你可以做这样的事情。首先使用 perl 正则表达式首先替换并带上数值,如下所示,然后对其进行排序。这样您甚至可以只显示所需的信息。

perl -pe 's/(.+)(h_time=\d+, )(.+)/\2\1\3/g' log | sort -V

这给出了:

h_time=51, Sep 12 05:14:00 host1[716]: 2018-09-12 05:14:00.076 [MessageBroker-2] INF 1 com.acme l=35 h_status=success, msg=some message
h_time=54, Sep 11 20:00:00 host1[716]: 2018-09-11 20:00:00.389 [MessageBroker-2] INF 1 com.acme l=35 h_status=success, msg=some message
h_time=77, Sep 12 04:42:00 host1[716]: 2018-09-12 04:42:00.682 [MessageBroker-2] INF 1 com.acme l=35 h_status=success, msg=some message
h_time=8, Sep 12 05:15:02 host1[716]: 2018-09-12 05:15:02.536 [Test worker    ] INF 2 com.acme l=35 h_status=success, msg=some message

或者,如果您只需要一些信息:

perl -pe 's/(\w+ \d+ [\d:]+).+\[(.+)].+h_time=(\d+), .+/\3 ms\t\2\t\t\1/g' log | sort -V

这给出了:

8 ms    Test worker             Sep 12 05:15:02
51 ms   MessageBroker-2         Sep 12 05:14:00
54 ms   MessageBroker-2         Sep 11 20:00:00
77 ms   MessageBroker-2         Sep 12 04:42:00

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 2011-07-11
    • 2013-10-06
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2016-08-24
    相关资源
    最近更新 更多