Komut çıktısını renge göre filtrele


13

Çıktısını filtrelemek için bir yol sunmayan bir yardımcı program çalıştırıyorum. Çıktı metnindeki hiçbir şey belirli bir işlevin başarısız olduğunu, ancak kırmızı renkte gösterilmediğini göstermez. Çıktı o kadar uzun ki sonunda bazı # hata bildirdiğinde hatanın oluştuğu çıktıyı görmek için her zaman kaydıramıyorum.

Kırmızı olmayan metni nasıl filtreleyebilirim?

sözde kod:

dolongtask | grep -color red

Düzenle

Komut diğer renkleri de çıkarır ve kırmızı olmayan tüm metinleri filtreleyebilmem gerekir . Ayrıca metin renklendirme çok satırlıdır.


1
Açık olanı sorduğum için özür dilerim - ama tüm çıktılar açık >&1mı? Demek istediğim, eğer kırmızı şeyler gitmezse 2>/dev/null, değil mi?
mikeserv

Yanıtlar:


15

Rengin değiştirilmesi metne gömülü kaçış dizileri aracılığıyla yapılır . Her zaman, programlar ANSI kaçış dizileri yayınlamaktadır , çünkü günümüzde neredeyse tüm terminaller bunu desteklemektedir.

Ön plan rengini kırmızıya çevirmek için kaçış dizisi \e[31m, \ebir kaçış karakteri (sekizli 033, onaltılık 1b, ESC olarak da bilinir ^[) ve diğer çeşitli gösterimlerdir. 30-39 aralığındaki sayılar ön plan rengini ayarlar; diğer sayılar farklı öznitelikler ayarlar. \e[0mtüm nitelikleri varsayılan değerlerine sıfırlar. cat -vProgramın ne yazdırdığını kontrol etmek için çalıştırın , \e[0;31mönce tüm öznitelikleri sıfırlamak veya \e[3;31italikleri açmak (bazı terminallerin desteklemediği) gibi bazı değişkenler kullanabilir .

Ksh, bash veya zsh'de, $'…'tırnak işareti içinde ters eğik çizgi kaçışlarını etkinleştirmek için kullanabilirsiniz , bu $'\e'da bir kaçış karakteri elde etmenizi sağlar . Daha sonra geçmek istediğiniz ters eğik çizgiyi ikiye katlamanız gerekeceğini unutmayın grep. İçinde /bin/sh, "$(printf \\e)"değişmez bir kaçış karakteri kullanabilir veya yazabilirsiniz.

GNU grep -oseçeneğiyle, aşağıdaki snippet, kaçış dizisiyle başladığını , aynı satırla veya aynı satırla \e[31mbiteceğini ve gömülü kaçış dizisi içermediğini varsayarak kırmızı metni filtreler .\e[0m\e[30m

grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'

Aşağıdaki awkkod parçası, çok satırlı olsa bile kırmızı metni ayıklar.

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'

Birden fazla rengi (burada kırmızı ve macenta) filtreliyorsanız faydalı olabilecek renk değiştirme komutlarını koruyan bir varyasyon.

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'

Awk çözümü benim için çalıştı. Çıktıda renk tutmanın herhangi bir yolu var mı?
km6zla

@ ogc-nick Tamamen kırmızı çıktı mı istiyorsunuz? printf '\e[31m'; awk …; printf '\e[0m'
Gilles 'SO- kötü olmayı bırak

Sadece filtrelediğim renk için çıktıda kalması için.
km6zla

@ ogc-nick Düzenlememe bakın.
Gilles 'SO- kötü olmayı bırak'

6

Bazıları terminalde güzel renkler yapmaktan sorumlu olan kontrol karakterleri için grep bakabilirsiniz.

dolongtask | grep '[[:cntrl:]]'

Örneğin, grep'e kırmızı bir "test" yazıyor, bu da kontrol karakterleriyle çevrili olması nedeniyle onu buluyor:

$ echo -e '\033[00;31mtest\033[00m' | grep --color=none '[[:cntrl:]]'
test     <-- in red

--color=noneSadece eşleşti çıkışa kendi renklendirme geçerli değildir emin grep yapmaktır, ama sadakatle böylece kontrol karakterleri kabuk tarafından yorumlanır olacağını bütün çizgi yazdırır.


Güzel. Acaba biri daha ileri gidebilir ve özellikle kırmızı için test etmek grep -E $'\033\[0?[01];31m.+?\033\[0?0m'veya grep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'test etmek için bir şey yapabilir mi?
14'te steeldriver

Önerdiğiniz gibi regex'ler bulmaya başladım, ancak onları işe koymadan önce tökezledim [[:cntrl:]]. Sizinkini test ettim ve onlar benim için çalışıyor, yani. kırmızı ile eşleşiyor ve diğer renklerle eşleşmiyor.
savanto

Harika çalışıyor ancak her renkle eşleşecek. Soruda bahsetmedim ama diğer birçok renk de çıktı ve sadece kırmızı şeyleri görmek istiyorum. Basit ve çalışan kod için +1.
km6zla
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.