Я хочу отфильтровать некоторые почтовые идентификаторы, возвращаемые mailq
(Постфикс). Однако этот формат не очень удобен для использования с grep, поскольку информация для не замужем почтовые пакеты множественный линии:
9F701869D2 1356 Mon Aug 23 12:13:43 some@sender
(host some.host[1.2.3.4] said: 450 4.1.1 some error message)
some@recipient
9437586CF4 3153 Sat Aug 21 09:36:40 some@other.sender
(host some.host[1.2.3.4] said: 450 4.1.1 some error message)
some@other.recipient
Как проще всего получить, например, все почтовые идентификаторы, в которых произошел определенный код ошибки? Возможно, удалив (одиночные) символы новой строки, затем grep
ing, а затем cut
ing? Или с помощью другого, более подходящего инструмента?
Пожалуйста, объясните свой ответ. Меня больше всего интересует не решение моей текущей проблемы копированием и вставкой (фильтрация по коду ошибки), а понимание того, как легко анализировать такой многострочный вывод.
Что о:
grep -C 1 сказал:
-C является контекстом и возвращает одну строку до и после "said:". Кроме того, на будущее: -A - после, -B - до.
grep -C 1 сказал: | grep ^ [0-9] | вырезать -f1 -d ""
(для списка идентификаторов)
Если вам нужно что-то более сложное, вам придется использовать awk.
Я бы использовал Perl и Постфикс :: Парс :: Mailq модуль.
Если вы не знаете Perl, исправить хороший сценарий будет непросто, но не стесняйтесь обращаться за помощью.
Если вас интересует, как модуль анализирует проверку вывода источник
Пока вы можете придумать что-нибудь, что можно использовать для изоляции адреса отправителя или получателя, mailq можно анализировать с помощью awk:
mailq | grep @ | awk {'print $7'}