Рейтинг:0

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

флаг mx

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

2021-06-12 21:59:41 
2021-06-12 20:59:41.118 ИНФОРМАЦИЯ 1 --- [edElastic-14048] c.o.i.i.s.i.UserManagementServiceImpl : BUNDLE_PURCHASE_FAILED || 213550040214 | Не удалось выполнить простую покупку пакета для транзакции 5001235315807102834, ошибка декодирования JSON: невозможно десериализовать значение типа

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

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

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

флаг cn
Вы должны проверить справочную страницу grep, чтобы узнать, что делает `-o`.
флаг cn
Ключом к отладке конвейеров является запуск первой команды и проверка ее вывода, затем добавление следующей команды в конвейер и т. д.
Рейтинг:2
флаг cn

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

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

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

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

$ awk Файл NF>10{print $1,$2,$11}
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' файл 
2021-06-12 20:59:41 213550040214

включает расширенные регулярные выражения, которые упрощают здесь синтаксис и рассказывает сед ничего не печатать по умолчанию. Тогда оператор подстановки (с/старый/новый/) попытается сопоставить форматы, которые вы ищете, и захватить их (скобки «захватят» шаблоны), чтобы мы могли заменить все только двумя совпавшими разделами (\1 \2).

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

Mihiran Chathuranga avatar
флаг mx
Это работает. На самом деле я использую обозреватель журналов grafana. Но я не знаю, как писать такие сложные запросы Loki. Вот почему я копирую журналы в текстовый файл и делаю это так. У вас есть какие-либо идеи о запросах Loki.
terdon avatar
флаг cn
@MihiranChathuranga нет. Я не знаю, кто такой Локи. Но именно поэтому вы должны дать контекст в своих вопросах.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.