Tandai kemunculan kata kunci dengan warna berbeda


13

Saya punya program yang mengeluarkan output stdoutseperti:

[OK]      Something is ok
[OK]      Something else is also ok
[FAIL]    This does not look good
[FAIL]    Neither does this
[OK]      At least this is fine

Untuk lebih mudah menemukan kegagalan dari output, saya ingin menandai kemunculan kata kunci FAILdengan warna merah tanpa mengabaikan pesan lainnya. Alangkah baiknya jika saya juga bisa menyorot OKkata kunci dengan hijau :).

Melakukan pipa ke egrep --color FAILhanya akan menampilkan garis-garis di mana FAILkata kunci hadir.


1
Untuk grepsolusinya lihat unix.stackexchange.com/a/34322
manatwork

apakah Anda memiliki akses untuk mengubah kode sumber? apakah ini skrip bash?
h3rrmiller

@manatwork Dari tautan yang Anda tentukan, saya mengklik cara saya ke stackoverflow.com/questions/972370 dan dengan beberapa tail -fdan awksulap, saya senang pergi =)
Theodor

Jawaban:


10

Berdasarkan manatworkretas kecil "atau tidak sama sekali" yang brilian dalam pertanyaan lain, saya menawarkan ini, yang menambahkan kemampuan untuk mendapatkan dua warna highlight:

 $ myprogram | \
   GREP_COLORS='mt=01;32' egrep --color=always '\[OK\]|' | \
   GREP_COLORS='mt=01;31' egrep --color=always '\[FAIL\]|'

Artinya, Anda menjalankan grepoutput dua kali, dengan GREP_COLORSvariabel lingkungan yang berbeda setiap kali.

Nilai '01; 32 'berarti "bold green", dan yang lainnya berarti "bold red". Lihat artikel Wikipedia pada kode ANSI untuk lebih banyak ide.

Sayangnya, ini membutuhkan GNU grep versi 2.5.3 atau lebih tinggi. Versi GNU grep yang lebih lama mendukung mekanisme pewarnaan yang berbeda, tetapi versi-versi tersebut memiliki bug yang mencegah Anda menggunakan fitur ini dalam pipeline lebih dari sekali. BSD grep mengemulasi mekanisme pewarnaan grep GNU yang lebih lama, dan itu akan bekerja dua kali dalam satu pipeline, tetapi ia berteriak tentang "sub-ekspresi kosong" karena manatworkperetasan.

Anda dapat menghapus garis miring terbalik pada akhir dua baris pertama untuk menjadikan semuanya satu baris. Saya baru saja membaginya di sini untuk kejelasan dan bermain bagus dengan format halaman SE.


Itu memang brilian! Tetapi untuk beberapa alasan skrip sepertinya tidak menyoroti pernyataan kedua pada mesin saya. Saya menjalankan CentOS 5.
Theodor

2
Apa yang terjadi di sini adalah bahwa CentOS 5 mengirimkan grep GNU yang cukup tua sehingga tidak mendukung GREP_COLORS, jamak. Hanya menggunakan GREP_COLORmetode yang lebih lama , dan metode itu memiliki bug di dalamnya yang mencegahnya melakukan hal yang benar. Jika Anda mengubah perintah untuk digunakan GREP_COLOR=32dan semacamnya, itu akan mengubah warna sorotan dari pertandingan pertama saja. Jika Anda menyalurkan hasilnya melalui hexdump -cAnda dapat melihat bahwa menambahkan egrepperintah kedua tidak melakukan sesuatu, tetapi itu bukan ANSI legal. Intinya: Anda harus memutakhirkan grepagar ini berfungsi dengan benar.
Warren Young

Haha itu komentar yang sangat mendalam. Ya CentOS5 sudah agak tua, karena dengan banyak OS: s berjalan di mesin lama meludah tua, Tuhan meninggalkan pesan log :) Saya akan mencoba untuk melihat apakah upgrade ke centos6 tidak mungkin.
Theodor

Saya baru saja memeriksa solusi saya pada CentOS 6 kotak, dan itu tidak bekerja di sana, mengkonfirmasikan diagnosis saya. (Tes sebelumnya dilakukan pada server Ubuntu.) EL6 dikirimkan dengan GNU grep 2.6.3. Menariknya, mereka juga memperbaiki GREP_COLORbug (tunggal), meskipun fitur itu usang segera setelah diganti.
Warren Young

Saya tidak dapat memahami bagaimana ini menyelesaikan masalah karena grep pertama akan menyaring semua "GAGAL" sehingga tidak akan ada yang tersisa untuk grep kedua yang cocok ..
laertis

1

Anda dapat menggunakan multitail atau ccze untuk ini, keduanya memungkinkan konfigurasi untuk mendeskripsikan regexps agar sesuai dan berwarna.


1

Berdasarkan jawaban Warren Young, saya menulis skrip Python ini yang melakukan hal yang sama dengan lebih elegan dan lebih sedikit mengetik. Jadi ini adalah bagaimana Anda akan menggunakan skrip itu:

cat yourfile | himul '\[OK\]' '\[FAIL\]'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.