Использование sed для получения даты - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть файл, который содержит два значения для ключевого слова abc.... Я хочу получить самую последнюю дату для совпадения abc... строки. После получения даты мне также нужно отформатировать дату, заменив / на -

    ---other data
2018/01/15 01:56:14.944+0000 INFO  newagent.bridge BridgeTLSAssetector::setupACBContext() - abc...

2018/02/14 01:56:14.944+0000 INFO  newagent.bridge BridgeTLSAssetector::setupACBContext() - abc...

    ---other data

В приведенном выше примере мой вывод должен быть 2018-02-14. Здесь я выбираю строку, содержащую значение abc..., и получаю только строку с последним значением даты. Затем мне нужно удалить оставшуюся строку и извлечь только значение даты.

Я использую следующее sed, но оно не работает

grep -iF "abc..." file.txt | tail -n 1 | sed -e 's/^[^|]*|[^|]*| *\([^ ]*\) .*/\1/' -e 's%/%-%g'

Ответы [ 5 ]

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

Легко и просто попробуйте это.

cat filename.txt | grep 'abc' | awk -F' ' '{print $1}'

Как шаблон abc всегда фиксируется в соответствии с данными журналов. Так что это будет более простой способ получения желаемого результата.

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

Когда вы используете sed для сопоставления части даты, вы можете указать год совпадения. месяц, дата и abc... в одной команде.

sed -rn 's#([0-9]{4})/([0-9]{2})/([0-9]{2}).*abc[.]{3}.*#\1-\2-\3#p' file.txt | tail -1
0 голосов
/ 02 ноября 2018

Так как вы просили sed -

$: sed -nE ' / abc[.]{3}/x; $ { x; s! .*!!; s!/([0-9])/!/0\1/!g; s!/([0-9])$!/0\1!g; s!/!-!g; p; }' in
2018-02-14

аргументы

  • -n говорит, что не печатать по умолчанию
  • -E говорит, использовать расширенные регулярные выражения

скрипт

  • / abc[.]{3}/x; скажем в каждой строке с abc... поменять строку для буфера
  • $ { x; s! .*!!; s!/([0-9])/!/0\1/!g; s!/([0-9])$!/0\1!g; s!/!-!g; p; } говорит, что в последней строке ($) выполняет набор команд внутри {}.
    • x заменяет буфер для возврата последней сохраненной записи.
    • s! .*!!; удаляет все из первого пробела (после даты)
    • s!/([0-9])/!/0\1/!g; добавляет ноль к месяцу, если необходимо
    • s!/([0-9])$!/0\1!g; добавляет ноль к дню, если необходимо
    • s!/!-!g; преобразует / в тире
    • p печатает полученную запись.
0 голосов
/ 02 ноября 2018

с awk:

$ awk '/abc\.\.\./{d=$1} END{gsub("/", "-", d); print d}' file.txt
2018-2-14

Что-то с sed:

tac file.txt | grep -Fi 'abc...' | sed 's/ .*//;s~/~-~g;q'
0 голосов
/ 02 ноября 2018

Это делает то, что вы хотите:

grep -iF "abc..." file.txt | tail -n 1 | awk '{print $1}' | sed 's#/#-#g'

Выводит это:

2018-02-14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...