Разбор системного журнала с помощью Regex - PullRequest
0 голосов
/ 22 ноября 2018

Я пишу регулярное выражение для анализа записи системного журнала.У меня есть проблемы с возможностью разобрать запись, пока я не нажму "CMD".Я хотел бы, чтобы все, что появляется после CMD, было сгруппировано в ().Кроме того, не могли бы вы дать предложения по улучшению регулярного выражения

Вот моя запись в системном журнале:

21 ноября 23:17:01 ubuntu-xenial CRON [10299]: (root)CMD (cd / && run-parts --report /etc/cron.hourly)

(<?month>[A-z]{3})\s(<?date>[0-9]{2}?)\s(<?time>[0-9]+:[0-9]+:[0-9]+)\s(<?hostname>[a-z]+-[a-z]+)\s(<?daemon>[A-Z]+)(<?pid>\[[0-9]+\]):\s(<?user>\([a-z]+\))

1 Ответ

0 голосов
/ 22 ноября 2018

Вот мои ревизии, с комментариями.В целом, вам лучше делать меньше предположений о том, что будут содержать поля.Здесь я использую \S, что означает «все, кроме пробелов».Кроме того, \s+ будет соответствовать некоторому пробелу, будь то один символ или более.

(<?month>\S+)                    #
\s+                              # added + because single digit dates might have additional spaces
(<?date>[0-9]{1,2})              # changed {2}? to {1,2} because you might have one or two digits
\s+                              #
(<?time>[0-9]+:[0-9]+:[0-9]+)    #   
\s+                              #
(<?hostname>\S+)                 # anything which isn't whitespace
\s+                              #
(<?daemon>\S+)                   # just in case your daemon has a digit or lower case in its name
(<?pid>\[[0-9]+\])               #
:                                #
\s+                              #
\((<?user>\S+)\)                 # your username might have digits in it; don't capture the brackets
\s+                              #
CMD                              #
\s+                              #
\((<?command>.*)\)               # capture the command, not the brackets
\s*                              # in case of trailing space
$                                # match end of string
...