Вам необходимо захватить имя хоста с помощью второй группы захвата.
напр. используя ваш образец ввода:
$ 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
Это терминал, который отправляет экраны focus -in/focus -out xterm. vim устанавливает терминал в режим, который позволяет ему узнать, когда курсор покидает окно (, что он и делает, когда alt -вкладка ).
Вы могли бы предотвратить это, изменив режим, используемый в vim для управления мышью. Проверяя документацию xterm, vim должен был бы отправить определенную управляющую последовательность с 1004
параметром (, чтобы указать xterm отправить эти escape-последовательности ), но я не вижу этого в исходном коде vim -. ]. Какой-то другой терминал может делать это как побочный -эффект режима движения мыши -1003
(, который vim отправляет):
if (xterm_mouse_vers > 0) { if (on) // enable mouse events, use mouse tracking if available out_str_nf((char_u *) (xterm_mouse_vers > 1 ? ( #ifdef FEAT_BEVAL_TERM bevalterm_ison ? IF_EB("\033[?1003h", ESC_STR "[?1003h") : #endif IF_EB("\033[?1002h", ESC_STR "[?1002h")) : IF_EB("\033[?1000h", ESC_STR "[?1000h"))); else // disable mouse events, could probably always send the same out_str_nf((char_u *) (xterm_mouse_vers > 1 ? IF_EB("\033[?1002l", ESC_STR "[?1002l") : IF_EB("\033[?1000l", ESC_STR "[?1000l"))); mouse_ison = on; }
Вероятно, вам следует обратиться к руководству пользователя используемого вами терминала, чтобы узнать, какое ожидаемое поведение будет с vim.