perintah `highlight`

11

Apakah ada perintah yang dapat digunakan untuk dengan mudah menyorot (dengan warna, teks tebal atau back- / foreground) terbalik string khusus di stdin sambil meneruskan seluruh string ke stdout? Saya sedang berpikir untuk membangunnya , tetapi saya lebih suka menggunakannya jika sudah ada. Beberapa fitur yang diinginkan:

  1. String highlight terpisah disorot berbeda, dengan cara otomatis. Misalnya, string pertama akan disorot dalam warna merah, yang kedua berwarna hijau, yang ketiga berwarna biru tanpa konfigurasi manual .
  2. Mendeteksi dukungan warna dan jatuh kembali ke tebal / terbalik / metode penyorotan lain di mana tersedia.
  3. Izinkan untuk mencocokkan ekspresi reguler dan string literal.
  4. Lebih disukai melakukan sesuatu yang pintar jika pertandingan tumpang tindih, seperti "foobar" dan "barbar".
  5. Tidak ada yang dimodifikasi antara stdin dan stdout kecuali untuk penambahan kode warna.
l0b0
sumber
Ooo, pertanyaan bagus. Saya membutuhkan hal yang tepat ini dan akhirnya menulis sesuatu, tetapi hanya string warna yang dikodekan, tidak memiliki fitur yang Anda daftarkan
Michael Mrozek
Daripada menulis utilitas baru, itu akan sangat luar biasa untuk melihat ini sebagai tambahan untuk membuat sendiri.
mattdm
1
Filosofi unix yang tepat akan menjadi utilitas baru yang dapat disalurkan melalui tidak hanya grep tetapi juga aliran lainnya. Saya menduga setidaknya ada satu atau lebih modul Perl yang mungkin dapat melakukan ini untuk Anda, meskipun ...
Shadur
1
@Gilles: Pertanyaan itu jauh lebih terbatas cakupannya. Bahkan, membacanya adalah salah satu alasan saya membuat pertanyaan ini - Untuk meminta solusi yang lebih umum dan fleksibel.
l0b0

Jawaban:

4

Mungkin Generik Colouriser (grc) Radovan Garabík ? Itu mengharapkan file konfigurasi sebagai argumen dan bekerja dengan regexp. Jadi bukan tanpa konfigurasi, tetapi Anda dapat menggunakan substitusi proses proses ( <(list)), jadi tentu saja tanpa konfigurasi manual :-)

artisoex
sumber
Untuk mengklarifikasi tanpa perlu membuka halaman (dan membuatnya dapat dicari), "yang ini" == Generic Colouriser ; grc dan grcat ... Terima kasih, saya suka itu.
Peter.O
grcmemiliki script helper: grcat. Berikut adalah contoh mewarnai semua huruf kapital dengan warna merah. Langkah 1: Atur file konfigurasi: printf "regexp=[A-Z]\ncolours=red\n" > ~/.grc/red-caps Langkah 2; Gunakan: echo Hello World | grcat red-caps... Halaman manual menyatakan 3 direktori config yang dicari, dan kemudian menyarankan (?) Bahwa file config dapat menjadi path absolut, tetapi metode terakhir ini untuk menemukan file config hanya bekerja dengan path relatif untuk saya (grc versi 1.3)
Peter.O
5

Sed untuk menyelamatkan!

Anda dapat meningkatkan ini (karena memang benar-benar membutuhkannya) tetapi berfungsi dengan cukup baik.

$ 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

Demi kesederhanaan, hilight menerima sepasang argumen (pertama pertandingan, kedua warna) Dalam skrip ini attrib selalu dicetak tebal

Baca man console_codes (Grafik Rendition) untuk melihat warna pelarian warna, atau coba ini

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

Ini memiliki kelemahan penting karena menggunakan karya ini:

$ dmesg | hilight \\[ 34 ] 34

tapi ini sama sekali tidak:

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

karena [: digit:] menemukan angka-angka dalam rahasia melarikan diri pada dukungan sebelumnya.

Sesuatu seperti:

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

akan selalu berfungsi sebagaimana dikecualikan.

Menggunakan perintah waktu saya menemukan kenaikan ini sebanyak empat kali waktu berlalu, yang tidak terlalu banyak.

Anda dapat mengganti perintah sed dengan parser lain yang Anda suka atau sesuai dengan kebutuhan Anda (awk, dll ...)

nenopera
sumber
2

Anda juga dapat menggunakan egrep dengan pola yang cocok dengan setiap baris pada karakter yang tidak dapat dicetak, seperti:

dmesg | egrep --color "swap|$"
Michal Sylwester
sumber
1

Clide bekerja dengan baik. Saya menggunakannya di RHEL 6.2, dari repositori EPEL

golimar
sumber
+1 untuk alat yang sangat bagus. Sayangnya tidak memiliki semua fitur yang diminta.
l0b0
1

Jika versi Anda grepdisertai dengan warna, maka Anda dapat menggunakan perubahan regexp untuk membuat grep menyoroti teks dan juga mencocokkan setiap baris sehingga tidak ada yang dikecualikan. Yang berikut harus melakukan trik:

<your command> |grep "highlightme\|^"
Eoghan
sumber
0

Seperti yang Anda sebutkan di tautan, grep --color=alwayshanya berfungsi untuk satu pola. Yang mengatakan, saya tidak percaya alat seperti itu ada.

Frederik Deweerdt
sumber
0

Saya menggunakan http://em.readthedocs.org/ . Mudah dipasang di berbagai platform karena Python. Sederhana dan berfungsi dengan baik.

ikalnitsky
sumber
Selamat datang di Unix & Linux Stack Exchange! Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
slm
1
Menurut pusat bantuan : "Namun, Anda harus mengungkapkan afiliasi Anda dalam jawaban Anda." Jika Anda adalah Igor Kalnitsky yang sama yang menulis em, harap tulis ulang jawaban Anda agar jelas bahwa Anda bukan pengguna, tetapi penulis alat yang disarankan.
manatwork