grep: 2 anahtar kelime nasıl renklendirilir?


12

1 komutunu kullanarak 2 anahtar kelime grep nasıl biliyorum, ama ben sadece çıktı birinde bunlardan birini renklendirmek için yönetebilirsiniz. İşte benim emrim:

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

Yalnızca keyword2vurgulanır. keyword1Aynı anda nasıl vurgulanabilirim?

Yanıtlar:


15

grepKomutu bir kabul --color=alwayskullanabilirsiniz, böylece seçeneği

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

Gertvdijk belirttiği gibi , bu komut verimsiz olabilir, ancak hem keyword1 hem de keyword2 içeren tüm satırları arayacaktır. Bunları farklı renklerde vurgulamak isterseniz,

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

anahtar kelime2'yi mavi renkte vurgulayacaktır. Bu mtbölüm, grepbu CSI kodunu kullanarak eşleşen metni vurgulayacak ve 01;34"normal arka planda koyu mavi ön plan" anlamına gelecektir .


1
Kullanım durumu için ayrıntılı açıklama ve özelleştirme seçenekleri için +1!
gertvdijk

Komik, bunu ile denediğimde: grep -R --color = always keyword1. | grep keyword2 // yalnızca ilk anahtar kelime işaretlenir. Yanıtınızı özyinelemeli arama ile çalışmak için nasıl uyarlayabilirim?
TenLeftFingers

1
Bu garip, grep -R --color=always keyword1 . | grep keyword2işe yaramalı . Çıkışı tekrar mı yönlendiriyorsunuz (ikincisini grepiçine çekmek gibi less -R)? Öyleyse --color=always, ikincisine de eklemeniz gerekir .
Daniel H

Mükemmel cevap! Her ikisini de vurgulamak --color=autoiçin grep, hemen sonra ikinci için bir ihtiyaç olacaktır 'keyword2'.
Luis

@Luis Evet, Grep en azından genellikle hiçbir rengin varsayılan olduğunu haklısın (bu bir yapılandırma zamanı seçeneği olsa da? 2013'te makinem olmadan çalıştığında geçersiz kıldığımı sanmıyorum…). Cevaba ekledim --color=always, çünkü cevabı lessya da başka bir şeye bağlamak isteyebilirsiniz .
Daniel H

3

Başka bir örneğe yöneltmek yerine gerçek düzenli ifadeleri deneyin grep, örn:

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

Bu, maalesef, bu anahtar kelimelerin yalnızca bu sırayla eşleştiği eşleşen satırlarla sınırlıdır. Her neyse, grepsorunuzun kullanımı oldukça verimsiz ve bundan kaçınmalısınız. @DanielH cevabı muhtemelen dava için oldukça fazla daha basittir.

Anahtar kelimelerin 'veya' eşleşmesi için bunu düzenli olarak kullanıyorum:

grep -E "(foo|bar)" file

1
Ben OP sadece her iki anahtar kelime (verdiğiniz komut her iki birini içeren tüm satırları verir) istediğini düşünüyorum.
Daniel H

@DanielH Bunu işaret ettiğiniz için teşekkürler. Cevabımı güncelledim.
gertvdijk

Bu hala sadece foo bardan önce gelirse işe yaramıyor mu? Daha iyi bir yolu var mı foo.*bar|bar.*foo, ya da bu durumda (bu muhtemelen anahtar kelimeler için standart bir sipariş olurdu bir günlük dosyası gibi görünüyor) için gerekli olup olmadığını bilmiyorum . Sizinkini güncellemeden önce cevabımı ekledim, ancak zincirlerin grepgerçekten gerekli olduğu bir durumda (veya başka herhangi bir zaman renkli çıkışın terminale gönderilmemesi gerektiği gibi grep | less -R) saklayacağım .
Daniel H
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.