Переключение цвета осуществляется с помощью 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
на одной и ту же линию, и содержат не вложенную последовательность.
grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'
Следующий awk
фрагмент извлекает красный текст, даже если он многострочный.
awk -v RS='\033' '
match($0, /^\[[0-9;]*m/) {
color = ";" substr($0, 2, RLENGTH-2) ";";
$0 = substr($0, RLENGTH+1);
gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
red = (color ~ /1;*$/)
}
red'
Вот вариант, который сохраняет команды изменения цвета, которые могут быть полезны, если вы фильтруете несколько цветов (здесь красный и пурпурный).
awk -v RS='\033' '
match($0, /^\[[0-9;]*m/) {
color = ";" substr($0, 2, RLENGTH-2) ";";
printf "\033%s", substr($0, 1, RLENGTH);
$0 = substr($0, RLENGTH+1);
gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
desired = (color ~ /[15];*$/)
}
desired'
>&1
? Я имею в виду, красные вещи не исчезнут, если ты2>/dev/null
, верно?