Анализируйте журнал с помощью perl

В Emacs вы можете поместить эти строки в вашем файле инициализации:

(global-set-key [(control ?+)] 'text-scale-increase)
(global-set-key [(control ?-)] 'text-scale-decrease)

По умолчанию команды изменения размера шрифта находятся в меню, которое появляется на Shift + Button1 ( Button1 - это левую кнопку мыши).

0
14.03.2018, 08:05
2 ответа

Попробуйте это:

perl -nle'($time, $host) = /^(\S+)\s(?:\S+\s+){8}\S+="(\S+?)"/; print "$time $host"'

Выход:

2016-05-07T09:07:04.933343+00:00 jamaican.com
  • \Sозначает не -пробел
  • \s— пробел
  • (?:)— логическая группа, которая не захвачена
  • {8}— пропущенные «слова»
  • \S+="(\S+?)"означает :пропустить до =и захватить то, что находится между двумя "кавычками
  • ($time, $host) = /.../назначает две захваченные группы $timeи $host
  • .
3
28.01.2020, 02:24

Вам необходимо захватить имя хоста с помощью второй группы захвата.

напр. используя ваш образец ввода:

$ cat test.log 
2016-05-07T09:07:04.933343+00:00 heroku[router]: status=301 bytes=680 service=2698ms connect=1ms dyno=web.2 fwd="10.29.10.29" at=info host="jamaican.com" request_id=32fc8d88-99f8-4cc2-89f9-284d059eebf8 method=GET path="/blog"

Этот лайнер Perl One -извлекает как метку времени, так и поле имени хоста. Я также немного улучшил регулярное выражение, используя \dдля цифр со счетчиком совпадений для каждой.

$ perl -lne 'print "$1 $2" if (m/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+\+\d{2}:\d{2}) ([^ ]+) /)' test.log
2016-05-07T09:07:04.933343+00:00 heroku[router]:

Другой вариант:

$ perl -lne 'print "$1 $2 $3" if (m/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+\+\d{2}:\d{2}) ([^[]+)\[([^]]+)\]/)' test.log
2016-05-07T09:07:04.933343+00:00 heroku router

Я предположил, что вам нужно имя хоста локальной машины (Я даже не заметил host="jamaican.com"часть записи журнала ). Вероятно, это не то, что вам нужно, поэтому, если вам нужно имя хоста, заключенное в двойные кавычки -после host=, тогда:

$ perl -lne 'print "$1 $2" if (m/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+\+\d{2}:\d{2}).*host="([^"]+)"/)' test.log
2016-05-07T09:07:04.933343+00:00 jamaican.com 

или (намного проще):

$ perl -lne 'print "$1 $2" if (m/(^\S+).*host="([^"]+)"/)' test.log
2016-05-07T09:07:04.933343+00:00 jamaican.com

Или извлеките метку времени, проанализируйте ее с помощью Date::Parseи переформатируйте с помощью Date::Format.

$ perl -MDate::Parse -MDate::Format -lne \
  'if (m/(^\S+).*host="([^"]+)"/) {
     print join(" ", time2str("%Y-%m-%d %R %z",str2time($1)), $2)
   }' test.log
2016-05-07 19:07 +1000 jamaican.com

Обратите внимание, :метка времени была преобразована в местный часовой пояс (для меня, это +1000 или австралийское восточное стандартное время ). time2str()по умолчанию использует местный часовой пояс, но вы можете задать ему третий аргумент (time2str(TEMPLATE, TIME [, ZONE])), чтобы он выдавал время в любом другом поясе.

$ perl -MDate::Parse -MDate::Format -lne   'if (m/(^\S+).*host="([^"]+)"/) {
     print join(" ", time2str("%Y-%m-%d %R %z",str2time($1),"+0"), $2)
   }' test.log
2016-05-07 09:07 +0000 jamaican.com
0
28.01.2020, 02:24

Теги

Похожие вопросы