С учетом того, что более поздние даты появляются позже в файле, необходимо печатать только дату из последней строки, содержащей initial...
.
Первый шаг (сбросьте -q
с grep
- вы не хотите, чтобы он был тихим):
grep -iF 'initial...' /tmp/file.log |
tail -n 1 |
sed -e 's/^[^|]*|[^|]*| *\([^ ]*\) .*/\1/' -e 's%/%-%g'
(первая) команда s///
сопоставляет серию нетрубов, за которыми следует труба, еще одна серия нетрубов, за которыми следует труба, пробел, затем захватывает серию непробелов и, наконец, соответствует пустое и прочее; он заменяет все это только захваченной строкой, которая является полем даты после второго канала в строке ввода. (Вторая) команда s%%%
заменяет косые черты на тире, используя %
, чтобы избежать путаницы в том, что эквивалентный s/\//-/g
может породить, тем самым переформатируя дату в формате ISO 8601.
Но мы можем потерять tail
с:
grep -iF 'initial...' /tmp/file.log |
sed -n -e '$ { s/^[^|]*|[^|]*| *\([^ ]*\) .*/\1/; s%/%-%gp; }'
-n
подавляет нормальный выход; $
соответствует только последней строке; p
после второй операции s///
печатает результат.
Поиск по фиксированному шаблону без учета регистра удобнее записать в grep
, чем в sed
. Хотя это можно сделать с помощью одной команды sed
, вам придется работать довольно усердно, сохраняя совпадающие строки в пространстве удержания, затем меняя местами удержание и пространство шаблона в конце, а также заменяя и печатая:
sed -n \
-e '/[Ii][Nn][Ii][Tt][Ii][Aa][Ll]\.\.\./h' \
-e '$ { x; s/^[^|]*|[^|]*| *\([^ ]*\) .*/\1/; s%/%-%gp; }' /tmp/file.log
Каждый из них создает вывод 2018-02-05 на данных выборки. Если вводить вход без initial...
, они ничего не выводят.