Сортировать файл журнала по полю ключ = значение с помощью командной строки - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть несколько гигабайт логов, и я пытаюсь отследить наихудшее время выполнения данного метода, поэтому я использовал 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 . Я пытался сделать это с помощью сортировки, но у меня ничего не получилось, потому что я не понимаю, как извлечь значение поля h_time.

Я искал, как использовать пользовательские разделители для идентификации пользовательских полей с помощью сортировки, и обнаружил this и this anwser, безуспешно.

Как я могу отсортировать эти строки в порядке убывания по полю h_time, используя какой-либо инструмент командной строки, используя как можно более простой синтаксис?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы могли бы сделать что-то вроде этого. Сначала используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...