`vurgulama 'komutu


11

Tüm dizgiyi stdout'a geçirirken stdin'de belirli dizeleri kolayca vurgulamak için kullanılabilecek bir komut var mı? Onu inşa etmeyi düşünüyorum , ama zaten varsa kullanmayı tercih ederim. Bazı arzu edilen özellikler:

  1. Ayrı vurgu dizeleri otomatik olarak farklı şekilde vurgulanır. Örneğin, ilk dize elle yapılandırılmadan kırmızı, ikincisi yeşil, üçüncüsü mavi renkle vurgulanacaktır .
  2. Renk desteğini algılar ve kullanılabildiği yerlerde kalın / ters / diğer vurgulama yöntemlerine geri döner.
  3. Normal ifadelerin ve değişmez dizelerin eşleşmesine izin ver.
  4. Tercihen eşleşmeler çakışırsa akıllı bir şey yapar, örneğin "foobar" ve "barbar".
  5. Renk kodlarının eklenmesi dışında, stdin ve stdout arasında hiçbir şey değiştirilmez.


Ooo, güzel soru. Bu tam şeye ihtiyacım vardı ve bir şeyler yazmayı bitirdim, ancak sadece renk kodlu sabit dizeler, listelediğiniz özelliklerden hiçbirine sahip değildi
Michael Mrozek

Yeni bir yardımcı program yazmak yerine, bunu grep'in bir eki olarak görmek çok harika olurdu.
mattdm

1
Uygun unix felsefesi, sadece grep'ten değil, diğer akışlardan da geçebilecek yeni bir yardımcı program olacaktır. Sanırım bunu muhtemelen sizin için yapabilen en az bir veya daha fazla Perl modülü var ...
Shadur

1
@Gilles: Bu soru kapsam olarak çok daha sınırlıdır. Aslında, okumak bu soruyu yaratmamın nedenlerinden biriydi - Daha genel ve esnek bir çözüm istemek.
l0b0

Yanıtlar:


4

Belki Radovan Garabis'in Jenerik Renklendirici (grc) ? Bir yapılandırma dosyasını argüman olarak bekler ve regexp'lerle çalışır. Bu yüzden yapılandırma olmadan tam olarak değil, ancak süreç işlemi ikame ( <(list)) kullanabilirsiniz, bu yüzden manuel yapılandırma olmadan elbette :-)


Sayfayı açmaya gerek kalmadan açıklığa kavuşturmak (ve aranabilir hale getirmek) için "this one" == Genel Renklendirici ; grc ve grcat ... Teşekkürler, beğendim.
Peter.O

grcyardımcı betiği var grcat. İşte tüm büyük harfleri kırmızıya boyamaya bir örnek. Adım 1: Yapılandırma dosyasını ayarlayın: printf "regexp=[A-Z]\ncolours=red\n" > ~/.grc/red-caps Adım 2; Kullanın: echo Hello World | grcat red-caps... Man sayfası, aradığı 3 yapılandırma dizinini belirtir ve sonra (?) Yapılandırma dosyasının mutlak bir yol olabileceğini önerir, ancak config dosyasını bulmanın bu son yöntemi yalnızca benim için göreli yollarla çalışır (grc sürüm 1.3)
Peter.O

5

Kurtarma için Sed!

Bunu (gerçekten ihtiyaç duyduğu gibi) geliştirebilirsiniz, ancak oldukça iyi çalışır.

$ cat >~/bin/hilight <<EOF
#!/bin/bash
while [ $# -gt 0 ]
do
 COMANDO=$COMANDO's/'$1$'/\033[01;'$2$'m\033[K\\0\033[m\033[K/g\n'
 shift;shift;
done

sed -e "$COMANDO"
EOF

Basitlik adına, hilight çift argümanı kabul eder (önce eşleşme, ikincisi renk) Bu komut dosyasında nitelik her zaman kalın

Renk kaçış güvenliğini görmek için man console_codes (Grafik İşleme) bölümünü okuyun veya deneyin

for attrib in $(seq 0 12); do
  for color in $(seq 30 37) $(seq 40 47) $(seq 90 97); do
    printf %b " $attrib $color:\033[$attrib;${color}mhi, dudes\033[m"
  done
done

Bu çalışmaları kullanmak gibi önemli dezavantajları vardır:

$ dmesg | hilight \\[ 34 ] 34

ama bu hiç de değil:

$ dmesg | hilight \\[ 34 ] 34 [[:digit:]] 31

çünkü [: digit:] önceki emirlerde kaçış emniyetlerindeki rakamları bulur.

Gibi bir şey:

$ cat /var/log/kern.log | hilight kernel 31 a 34 et 33

her zaman istisna olarak çalışır.

Zaman komutunu kullanarak, geçen süreyi dört kat arttırdım, ki bu çok fazla değil.

Sed komutunu istediğiniz herhangi bir ayrıştırıcıyla değiştirebilir veya ihtiyaçlarınıza uygun (awk, vb ...)


2

Ayrıca, yazdırılamayan karakterdeki her satıra uyan desene sahip egrep kullanılabilir:

dmesg | egrep --color "swap|$"

1

clide iyi çalışıyor. EPEL deposundan RHEL 6.2 üzerinde kullanıyorum


Çok güzel bir araç için +1. Maalesef istenen tüm özelliklere sahip değil.
l0b0

1

Sürümünüz greprenkle geliyorsa, grep'in metni vurgulamasını sağlamak ve her satırı eşleştirmek için regexp değişikliğini kullanabilirsiniz, böylece hiçbir şey hariç tutulmaz. Aşağıdakiler hile yapmalıdır:

<your command> |grep "highlightme\|^"

0

Bağlantıda belirttiğiniz gibi, grep --color=alwayssadece bir desen için çalışır. Bununla birlikte, böyle bir aracın var olduğuna inanmıyorum.


0

Kullandığım http://em.readthedocs.org/ . Python sayesinde çeşitli platformlara kurulumu kolaydır. Basit ve iyi çalışıyor.


Unix ve Linux Stack Exchange'e hoş geldiniz! Bu teorik olarak soruyu cevaplayabilse de , cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak tercih edilir.
slm

1
Göre yardım merkezinin : “Bununla birlikte, gereken yanıtlarınıza ilişkinizi açıklamaktadır.” Yazan aynı Igor Kalnitsky iseniz em, lütfen bir kullanıcı değil, önerilen aracın yazarı olduğunuzu açıklamak için cevabınızı yeniden yazın.
Ocak'ta
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.