Как объединить команду grep и команду sed в одном текстовом файле и получить вывод в другой файл?

Я скопировал следующий журнал из проводника журнала grafana.

2021-06-12 21:59:41 
2021-06-12 20:59:41.118  INFO 1 --- [edElastic-14048] c.o.i.i.s.i.UserManagementServiceImpl    : BUNDLE_PURCHASE_FAILED || 213550040214 |  Failed to Do Simple Bundle Purchase  For Transaction 5001235315807102834, Error JSON decoding error: Cannot deserialize value of type

мой ожидаемый результат:

2021-06-12 21:59:41  213550040214 

Я использую команду ниже, чтобы получить ожидаемый результат:

grep -Eo "[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}" bfailed.txt | grep -Eo "[0-9]{12}" | sed '/[a-zA-Z]/d' > b.txt

Но эта команда не дает никаких результатов. Как я могу получить ожидаемый результат?

0
задан 14 June 2021 в 12:53

1 ответ

Ваша команда не выводит результат, потому что вторая команда grep ничего не соответствует:

grep -Eo "[0-9]{12}" 

Это ищет ровно 12 последовательных чисел, но у вас никогда не бывает 12 последовательных чисел, потому что ваш первый grep выводит только дату и время, поэтому остальная часть строки уже потеряна.

Если на самом деле введены только две строки, которые вы показываете, то все, что вам нужно, - это напечатать 1-е, 2-е и 11-е поле в строках, которые имеют как минимум 11 полей:

$ awk 'NF>10{print $1,$2,$11}' file
2021-06-12 20:59:41.118 213550040214

Если у вас больше строк и вам действительно нужно соответствовать определенному формату даты и времени, вы можете попробовать следующее:

$ sed -En 's/([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}).*([0-9]{12}) .*/\1 \2/p' file 
2021-06-12 20:59:41 213550040214

-E включает расширенные регулярные выражения, которые упрощают здесь синтаксис, а -n сообщает sed по умолчанию ничего не печатать. Затем оператор подстановки ( s / old / new / ) попытается сопоставить форматы, которые вы ищете, и захватит их (скобки «захватывают» шаблоны), чтобы мы могли заменить все только двумя сопоставленными разделы ( \ 1 \ 2 ).

Обратите внимание, что это найдет последний отрезок из 12 чисел, поэтому он не будет работать, если у вас будет более одного такого набора. Мы могли бы предложить вам более конкретное решение, но вы должны будете предоставить нам более подробную информацию о вашем файле, о том, что является переменным, а что никогда не меняется.

2
ответ дан 28 July 2021 в 11:28

Другие вопросы по тегам:

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