linux - 使用命令行按键=值字段对日志文件进行排序

标签 linux bash sorting

我有几千兆字节的日志,我正在尝试跟踪给定方法的最差执行时间,所以我使用 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 字段值的行。我尝试使用排序来做到这一点,但没有成功,因为我不知道如何提取 h_time 字段值。

我搜索了如何使用自定义分隔符来使用排序来识别自定义字段并找到了 thisthis回答,没有成功。

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

最佳答案

你可以这样做。首先使用 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

关于linux - 使用命令行按键=值字段对日志文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52288954/

相关文章:

java - 修改后的快速排序可以是 O(n) 的最佳情况吗?

linux - 在 Nagios 中创建事件

linux - awk/gawk asorti() 问题

c++ - 使用比较器网络对固定长度数组进行非常快速的排序

javascript - 是否可以在 Javascript 中映射或排序数组对象

bash - 从 Bash 中的另一个变量中删除字符串匹配项

C++ Linux获取MAC地址在同一台计算机上返回不同的值

linux - 使用性能报告从特定的二进制文件中获取符号

linux - 可用IP列表

Bash:创建不同格式和文件夹的音乐文件副本