У меня есть файл журнала с именем version.txt, и мне нужно отфильтровать все слова с ключевым словом (time=
, вывод должен выглядеть следующим образом (time=451)
и т. д.
Ниже приведены примеры записей из файла журнала. Выделил записи, которые хочу вывести в список. Если я вырежу или обрежу, то вместо слова будет напечатана вся строка (time=
.
Предложите, пожалуйста, команду для перечисления слов, начиная с (time=
числа и до конца )
.
2020-03-10 06:48:20 [http-nio-7001-exec-7] INFO [5e6770737be8a35b5fef38f7be2a2635] [5fef38f7be2a2635] [] c.l.e.i.a.c.ItemAvailabilityControllerImpl - DeliveryMethod(sosItmNbr=null, fullMtdTyp=3, fullMtdMsg=Delivery, fullCarrier=null, fullCarrierSvc=null, fullTransitMode=null, fullLctNbr=0, restMsg=null, isAvlSts=false, reqStates=[], onhandQty=0, totalQty=0, itmLdTmAvlQty=0, itmLdTm=null, itmConsolidationDate=null, itmLdTmDays=null, itmLdTmDaysLow=null, fullPath=null)])]) (time=451)
2020-03-10 06:48:20 [http-nio-7001-exec-28] INFO [5e677073e64bd99b5997b5bd20c3c4e0] [5997b5bd20c3c4e0] [] c.l.e.i.a.c.ItemAvailabilityControllerImpl - Finished availability process; Response: IAResponse(locationItemData=[ResponseItem(lctNbr=6877, itemNbr=10000070, modID=1500040, omniID=null, vbuNbr=14692, itmTypCode=3, reqQty=17, itemAvailList=[DeliveryMethod(sosItmNbr=null, fullMtdTyp=1, fullMtdMsg=Parcel, fullCarrier=null, fullCarrierSvc=null, fullTransitMode=null, fullLctNbr=0, restMsg=null, isAvlSts=false, reqStates=[], onhandQty=0, totalQty=0, itmLdTmAvlQty=0, itmLdTm=null, itmConsolidationDate=null,(time=455)
2020-03-10 06:48:20 [http-nio-7001-exec-46] INFO [5e6770731c4e323f4cb875712bb0d8ee] [4cb875712bb0d8ee] [] c.l.e.i.a.c.ItemAvailabilityControllerImpl - Finised (time=492)
Вывод этого примера ввода должен выглядеть следующим образом:
(time=451)
(time=455)
(time=492)
решение1
Вопрос не совсем ясен.
Команда
grep -o '(time=[[:digit:]]*)' inputfile
с примером ввода из вопроса печатает
(time=451)
(time=455)
(time=492)
Отредактируйте, чтобы учесть дополнительные требования из комментария:
Добавление поля даты и времени из начала строк в вывод требует другой команды.
Если все строки ввода содержат (time=...)
и начинаются с полей даты и времени, разделенных одинарными пробелами, вы можете использовать
sed 's/^\([-0-9]* [:0-9]* \).*\((time=[[:digit:]]*)\).*/\1\2/' inputfile
Это печатает
2020-03-10 06:48:20 (time=451)
2020-03-10 06:48:20 (time=455)
2020-03-10 06:48:20 (time=492)
Если есть другие несовпадающие строки, вы можете объединить их с тем же grep
шаблоном, что и выше, но опустить -o
.
grep '(time=[[:digit:]]*)' inputfile | sed 's/^\([-0-9]* [:0-9]* \).*\((time=[[:digit:]]*)\).*/\1\2/'
Обратите внимание, что шаблон поиска в моей sed
команде не очень строгий.
Часть [-0-9]* [:0-9]*
соответствует любому количеству цифр и тире в любой комбинации (дата), за которыми следует один пробел, любому количеству цифр и двоеточий (время), за которыми снова следует один пробел. Шаблон привязан к началу строки предшествующим ^
.
Таким образом, он также будет соответствовать неправильным полям даты и времени, например, ---123--456- 9876:54321
или даже двум пробелам в начале строки.