Regexp для 2-х дат форматы SED

Как мне написать регулярное выражение для sed, которое извлекает только поле DATE из файлов журнала, принимающих оба этих формата даты:

Jun  9 16:56:14 mailserver postfix ...
2017-06-04T06:59:36.984086+02:00 mailserver postfix ...

С awk, выводящим столбец $ 1 будет работать во втором случае, но не в первом.

0
15.06.2017, 12:00
1 ответ

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

$ cat test.txt 
Jun  9 16:56:14 mailserver postfix ...
2017-06-04T06:59:36.984086+02:00 mailserver postfix ...
$ sed 's/^\([0-9:+\.T\-]*\|[A-Z][a-z]*\s*[0-9]*\s[0-9:]*\)\s.*/\1/' < test.txt 
Jun  9 16:56:14
2017-06-04T06:59:36.984086+02:00

Объяснение:

  • Совпадение в начале строки: ^
  • используйте круглые скобки с обратной косой чертой, чтобы указать область интереса для обратной ссылки в замене (см. ниже), т.е. «дата» перед «остальным текстом журнала»
  • в скобках: сопоставьте оба варианта (используйте \| для обозначения альтернативы обоих подвыражений)
  • после скобок: соответствовать остальной части строки, потому что мы хотим ее отбросить (сначала это кажется немного нелогичным, но см. следующий пункт)
  • заменить всю строку (именно поэтому мы сопоставляем остальные ) с обратной ссылкой на совпадение даты: \1
1
28.01.2020, 02:45

Теги

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