Перемикання кольору здійснюється за допомогою послідовностей, що вбудовуються в текст. Незмінно програми видають послідовності виходу ANSI , тому що саме зараз підтримують практично всі термінали.
Послідовність виходу для перемикання кольору переднього плану на червоний - це \e[31mде \eпозначає символ втечі (восьмеричний 033, шістнадцятковий 1b, також відомий як ESC, ^[та інші інші позначення). Цифри в діапазоні 30–39 задають колір переднього плану; інші числа задають різні атрибути. \e[0mскидає всі атрибути до їх значення за замовчуванням. Запустіть, cat -vщоб перевірити, що програма друкує, вона може використовувати якийсь варіант, такий як \e[0;31mспочатку скинути всі атрибути або \e[3;31також увімкнути курсив (який багато термінали не підтримують).
У ksh, bash або zsh ви можете використовувати $'…'для ввімкнення зворотної косої риски всередині лапок, що дозволяє вводити $'\e'символ для втечі. Зауважте, що потім вам доведеться подвоїти будь-яку зворотну косу рису, яку ви хочете пройти grep. В /bin/sh, ви можете використовувати "$(printf \\e)"або введіть буквальний екранує символ.
За допомогою grep -oпараметра GNU наступний фрагмент фільтрує червоний текст, припускаючи, що він починається з послідовності запуску \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, правда?