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 \e
oznacza 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[0m
resetuje wszystkie atrybuty do ich wartości domyślnej. Uruchom, cat -v
aby sprawdzić, co program drukuje, może użyć jakiegoś wariantu, na przykład \e[0;31m
najpierw zresetować wszystkie atrybuty lub \e[3;31
włą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/sh
można użyć "$(printf \\e)"
lub wpisać dosłowny znak zmiany znaczenia.
W przypadku grep -o
opcji 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[0m
lub \e[30m
w tej samej linii i nie zawiera osadzonej sekwencji zmiany znaczenia.
grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'
Poniższy awk
fragment 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?