Zmiana koloru odbywa się poprzez sekwencje specjalne osadzone w tekście. Niezmiennie programy emitują sekwencje specjalne ANSI , ponieważ to właśnie obsługują obecnie wszystkie terminale.
Sekwencją zmiany znaczenia, która zmienia kolor pierwszego planu na czerwony, jest \e[31m, gdzie \eoznacza znak zmiany znaczenia (ósemkowy 033, szesnastkowy 1b, znany również jako ESC ^[i różne inne oznaczenia). Liczby z zakresu 30–39 określają kolor pierwszego planu; inne liczby ustawiają różne atrybuty. \e[0mresetuje wszystkie atrybuty do ich wartości domyślnej. Uruchom, cat -vaby sprawdzić, co program drukuje, może użyć jakiegoś wariantu, na przykład \e[0;31mnajpierw zresetować wszystkie atrybuty lub \e[3;31włączyć kursywę (które nie obsługuje wielu terminali).
W ksh, bash lub zsh możesz użyć, $'…'aby włączyć $'\e'znaki odwrotnego ukośnika w cudzysłowach, co pozwala pisać, aby uzyskać znak zmiany znaczenia. Pamiętaj, że będziesz musiał podwoić dowolny ukośnik odwrotny, który chcesz przekazać grep. W polu /bin/shmożna użyć "$(printf \\e)"lub wpisać dosłowny znak zmiany znaczenia.
W przypadku grep -oopcji GNU poniższy fragment kodu filtruje czerwony tekst, zakładając, że zaczyna się on sekwencją zmiany znaczenia \e[31m, kończy na jednej \e[0mlub \e[30mw tej samej linii i nie zawiera osadzonej sekwencji zmiany znaczenia.
grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'
Poniższy awkfragment wyodrębnia czerwony tekst, nawet jeśli jest wielowierszowy.
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'
Oto odmiana, która zachowuje polecenia zmieniające kolory, co może być przydatne, jeśli filtrujesz wiele kolorów (tutaj czerwony i magenta).
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? To znaczy, czerwone rzeczy nie znikają, jeśli ty2>/dev/null, prawda?