Korzystam z narzędzia, które nie oferuje sposobu filtrowania danych wyjściowych. Nic w tekście wyniku nie wskazuje, że dana funkcja nie powiodła się, ale jest wyświetlana na czerwono. Dane wyjściowe są tak długie, że pod koniec zgłaszania niektórych błędów nie zawsze mogę przewinąć, aby zobaczyć dane wyjściowe, w których wystąpił błąd.
Jak mogę odfiltrować tekst inny niż czerwony?
pseudo kod:
dolongtask | grep -color red
Edytować
Polecenie wyświetla inne kolory, jak również i muszę być w stanie filtrować się cały tekst, który nie jest czerwony. Również kolorowanie tekstu jest wielowierszowe.
>&1
? To znaczy, czerwone rzeczy nie znikają, jeśli ty2>/dev/null
, prawda?Odpowiedzi:
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.Poniższy
awk
fragment wyodrębnia czerwony tekst, nawet jeśli jest wielowierszowy.Oto odmiana, która zachowuje polecenia zmieniające kolory, co może być przydatne, jeśli filtrujesz wiele kolorów (tutaj czerwony i magenta).
źródło
printf '\e[31m'; awk …; printf '\e[0m'
Możesz mieć wygląd grep dla znaków kontrolnych, z których niektóre są odpowiedzialne za tworzenie ładnych kolorów na terminalu.
Na przykład, to echo czerwonego „testu” na grep, który stwierdza, że jest otoczony przez znaki kontrolne:
Ma
--color=none
to na celu upewnienie się, że grep nie stosuje własnej kolorystyki do dopasowanego wyjścia, ale wiernie drukuje całą linię, aby znaki kontrolne były interpretowane przez powłokę.źródło
grep -E $'\033\[0?[01];31m.+?\033\[0?0m'
lubgrep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'
przetestować konkretnie na czerwony?[[:cntrl:]]
. Przetestowałem twój i działają dla mnie, tj. dopasowywanie czerwonego i nie pasowanie do innych kolorów.