Solaris'te bir komuttan çıktıyı renklendirmek için sed komutunu kullanma


29

Hem linux hem de solaris üzerinde çalışması gereken bir ksh betiğim var. Belirli komutların çıktılarını renklendirmeye çalışıyorum. Linux üzerinde çalışır (özellikle RHEL6), ancak solarislerde (SunOS 5.10) çalışmaz.

Linux'da komut ("test" çıkışı doğru şekilde kırmızı renkte gösterilmiştir):

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test

Solaris'e verilen komut ("test" çıkışı renkli değil):

[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m

Bu komutu, çıktıdaki ham kodlar olmadan, çıktının kırmızı olduğu şekilde oluşturmanın bir yolu var mı? 'Echo' komutunu değiştiremiyorum çünkü bu aslında çalıştırdığım komut için bir doldurma.

Yanıtlar:


35

\xNN GNU sed'de bir kaçış dizisidir, ancak standart değildir ve özellikle Solaris'te mevcut değildir.

Komut dosyasına değişmez bir kaçış karakteri dahil edebilirsiniz, ancak bu okumayı ve düzenlemeyi zorlaştırır.

printfBir kaçış karakteri oluşturmak için kullanabilirsiniz . Onaltılık değil sekizli çıkışları anlar.

esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"

Çağrıda tputdeğiştirilecek metni oluşturmak için çağrı yapabilirsiniz . Bu komut terminfo veritabanındaki kaçış dizilerini arar . Teoride, tputkomut dosyası daha taşınabilir hale getirir, ancak pratikte ANSI çıkış kodlarını kullanmayan bir terminale rastlama ihtimaliniz yoktur .

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"

Bu cat |sedçok thx üzerinde renklendirmek için harika çalışıyor !
Kova Gücü

8

Kullanımı daha kolay olurdu tput

tput setaf 1; somecommand; tput sgr0

veya

tput setaf 1
somecommand
tput sgr0

Bu, ön planın kırmızı somecommandolmasını sağlar, ardından çıktıyı kırmızı olarak görüntüler, ardından renk sırasını siler. Bu ile en az çalışır bash, zshve ksh.

Yapabilecekleriniz hakkında daha fazla bilgi için tmux(1)ve bölümüne bakın .terminfo(5)tput


cevap için teşekkürler. Daha önce de söylediğim gibi, yankı komutunu değiştiremiyorum. 'echo' sadece benim çağırdığım sürecin bir değişkenidir, ki değiştiremiyorum. Bir şekilde sed'yi tput ile kullanmak mümkün müdür? Ayrıca, bu komutu sunOS 5.10'da çalıştırdığımda hiçbir renk göremiyorum.
acm

Ayrı komutlara ayırmak için güncelledim.
bahamat

Bu, şu anki uygulamamdan daha iyidir, çünkü solaris'lere ham ascii kodları basmaz. Ancak (ne sebeple olursa olsun) solarislerde 'bazı komutların' çıktılarını renklendirmez. Linux üzerinde yapar. Her ikisini de yapan @Gilles cevabını kabul ettim. Teşekkür ederim.
acm

0

Bazı terminaller (benim için iterm'deki bash gibi), "ctrl-v" ve ardından "ctrl + [" tuşlarına basmanıza izin verir ve bu karakter dizisi, çıkış karakterini karakter dizisine girer. Çalışırsa, ekranda "^ [" yazılan karakterleri büyük olasılıkla görürsünüz, ancak imlecinizi etrafında hareket ettirirseniz, karakterlerin gerisinde kaldığından, karakterleri tek karakter olarak görür.

Ne olduğunu anlamak (ve mümkün olup olmadığını test etmek için) için ctrl + v yazıp ctrl + i yazabilirsiniz. Sekme karakterinin bilgi istemi dizginize eklendiğini görmelisiniz. Orada bu durumun nedenine ilişkin CS geçmişi var: ama gerçekten eski klavye ctrl vardı + Ben zor çıkıyor kablolu sekme karakteri göndermek için; ve sekme tuşu da aynı elektrik sinyalini gönderir.

Bu eski nedenden ötürü, birçok terminal için bash, aynı ctrl kodlarını aynı karakterlerle eşleştirmek için hala yorumlamaktadır.

Ctrl + I sekme karakteriyle eşlenir ve ctrl + [ascii escape karakteriyle eşleşir.

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.