Перемикання кольору здійснюється за допомогою послідовностей, що вбудовуються в текст. Незмінно програми видають послідовності виходу 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
, правда?