我有几GB的日志,并且试图跟踪给定方法的最坏执行时间,因此我使用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
现在,我想按降序对文件进行排序,以获取具有最高 h_time 字段值的行。我尝试使用sort来做到这一点,但没有成功,因为我没有得到如何提取h_time字段值。
我搜索了如何使用自定义分隔符通过sort识别自定义字段,并发现this和this答案,但没有成功。
如何使用某种尽可能简单的语法,使用某些命令行工具,按h_time字段按desc顺序对这些行进行排序?
答案 0 :(得分:0)
您可以执行以下操作。首先使用perl regex替换并首先带入数字值,如下所示,然后对其进行排序。这样,您甚至可以只显示所需的信息。
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