grep: bagaimana cara mewarnai 2 kata kunci?

12

Saya tahu cara mengambil 2 kata kunci menggunakan 1 perintah, tetapi saya hanya dapat mengatur untuk memberi warna pada salah satu dari mereka dalam output. Ini perintah saya:

grep 'keyword1' file.log | grep 'keyword2'

Hanya keyword2disorot. Bagaimana saya dapat keyword1disorot pada saat yang sama?

Raptor
sumber

Jawaban:

15

The grepperintah menerima --color=alwayspilihan, sehingga Anda dapat menggunakan

grep 'keyword1' file.log --color=always | grep 'keyword2'

Seperti yang ditunjukkan gertvdijk , perintah ini mungkin tidak efisien, tetapi akan mencari semua baris yang mengandung kata kunci1 dan kata kunci2. Jika Anda ingin menyorotinya dalam berbagai warna, Anda dapat menggunakannya

grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

yang akan menyorot kata kunci2 dengan warna biru. Bagian ini mtberarti yang grepakan menyorot teks yang cocok menggunakan kode CSI ini , dan 01;34berarti "latar depan biru tebal pada latar belakang normal".

Daniel H
sumber
1
+1 untuk penjelasan terperinci dan opsi penyesuaian untuk use case!
gertvdijk
Lucu, ketika saya coba ini dengan: grep -R --color = always keyword1. | grep kata kunci2 // hanya kata kunci pertama yang disorot. Bagaimana saya bisa menyesuaikan jawaban Anda untuk bekerja dengan pencarian rekursif?
TenLeftFingers
1
Aneh, grep -R --color=always keyword1 . | grep keyword2seharusnya berhasil. Apakah Anda mengarahkan output lagi (seperti dengan memasukkan yang kedua grepke dalam less -R)? Jika demikian, Anda harus menambahkan --color=alwaysyang kedua juga.
Daniel H
Jawaban bagus! Untuk menyorot keduanya, --color=autoakan diperlukan untuk yang kedua grep, tepat setelah 'keyword2'.
Luis
@Luis Ya, Anda benar bahwa Grep setidaknya sering default ke tidak ada warna (walaupun itu mungkin opsi konfigurasi waktu? Saya tidak berpikir saya menimpanya pada 2013 ketika bekerja pada mesin saya tanpa itu ...). Saya menambahkan --color=alwaysjawaban, karena Anda mungkin ingin menyalurkannya ke lessatau sesuatu juga.
Daniel H
3

Coba ekspresi reguler aktual, alih-alih perpipaan ke instance lain grep, misalnya:

grep -E "\<foo\>.*\<bar\>" file

Sayangnya, batas ini hanya untuk baris yang cocok dengan kata kunci yang cocok dengan pesanan ini. Bagaimanapun, penggunaan grepdalam pertanyaan Anda agak tidak efisien dan Anda harus menghindarinya. The jawaban @DanielH cukup jauh lebih mudah untuk kasus Anda, mungkin.

Untuk pencocokan kata kunci 'atau', saya menggunakan ini secara teratur:

grep -E "(foo|bar)" file
gertvdijk
sumber
1
Saya pikir OP hanya menginginkan baris yang berisi kedua kata kunci (perintah yang Anda berikan memberikan semua baris yang berisi salah satu dari keduanya).
Daniel H
@DanielH Terima kasih telah menunjukkan itu. Saya telah memperbarui jawaban saya.
gertvdijk
Bukankah itu masih berfungsi jika foo datang sebelum bar? Saya tidak tahu apakah ada cara yang lebih baik daripada foo.*bar|bar.*foo, atau jika itu bahkan perlu untuk kasus ini (yang tampaknya merupakan file log yang mungkin akan memiliki urutan standar untuk kata kunci). Saya menambahkan jawaban saya sebelum Anda memperbarui jawaban Anda, tetapi saya akan menyimpannya kalau-kalau ada situasi di mana chained greps benar-benar diperlukan (atau waktu keluaran berwarna lainnya tidak boleh dikirim ke terminal, seperti grep | less -R).
Daniel H