Я запускаю утилиту, которая не предлагает способ фильтрации ее вывода. Ничто в тексте вывода не указывает на то, что конкретная функция не выполнена, но она отображается красным. Вывод настолько длинный, что в конце, когда он сообщает о # ошибках, я не всегда могу прокрутить, чтобы увидеть результат, где произошла ошибка.
Как я могу отфильтровать не красный текст?
псевдокод:
dolongtask | grep -color red
редактировать
Команда выводит другие цвета , а также и мне нужно , чтобы иметь возможность фильтровать вне весь текст, не красного цвета. Также окраска текста многострочная.
>&1
? Я имею в виду, красные вещи не исчезнут, если ты2>/dev/null
, верно?Ответы:
Переключение цвета осуществляется с помощью escape-последовательностей, встроенных в текст. Программы всегда выдают escape-последовательности ANSI , потому что это то, что в настоящее время поддерживают практически все терминалы.
Экранирующая последовательность для переключения цвета переднего плана на красный - это
\e[31m
где\e
экранирующий символ (восьмеричный 033, шестнадцатеричный 1b, также известный как ESC,^[
и различные другие обозначения). Числа в диапазоне 30–39 задают цвет переднего плана; другие числа устанавливают разные атрибуты.\e[0m
сбрасывает все атрибуты к их значению по умолчанию. Запустите,cat -v
чтобы проверить, что печатает программа, она может использовать какой-либо вариант, например,\e[0;31m
сначала сбросить все атрибуты или\e[3;31
также включить курсив (который не поддерживают многие терминалы).В ksh, bash или zsh вы можете использовать
$'…'
для включения обратной кавычки внутри кавычек, что позволяет вам печатать,$'\e'
чтобы получить escape-символ. Обратите внимание, что вам придется удваивать обратную косую черту, которую вы хотите передатьgrep
. В/bin/sh
, вы можете использовать"$(printf \\e)"
или ввести буквальный escape-символ.С GNU
grep -o
вариантом, следующий фрагмент кода фильтрует красный текст, при условии , что она начинается с последовательностью побега\e[31m
, заканчивается либо с\e[0m
или\e[30m
на одной и ту же линию, и содержат не вложенную последовательность.Следующий
awk
фрагмент извлекает красный текст, даже если он многострочный.Вот вариант, который сохраняет команды изменения цвета, которые могут быть полезны, если вы фильтруете несколько цветов (здесь красный и пурпурный).
источник
printf '\e[31m'; awk …; printf '\e[0m'
Вы можете использовать grep look для управляющих символов, некоторые из которых отвечают за создание красивых цветов на терминале.
Например, это отображает красный «тест» в grep, который находит его, потому что он окружен управляющими символами:
--color=none
просто для того, чтобы убедиться, что grep не применяет свою собственную раскраску к согласованному выводу, но печатает всю строку точно, так что управляющие символы будут интерпретироваться оболочкой.источник
grep -E $'\033\[0?[01];31m.+?\033\[0?0m'
или специальноgrep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'
проверить на красный?[[:cntrl:]]
. Я проверил ваши, и они работают на меня, т.е. соответствие красного цвета и не совпадение с другими цветами.