grep: arama eşleşmelerini vurgulama hariç tüm çıktıları görüntüle


43

Ben belirli bir düzenle eşleşen bir komut ve tek ekran çıkış hatlarını yürütmek, isterseniz bash, ben boru o kadar can grepgibi,

dosya test dosyası

hello
there
my
friends

komuta

$ cat testfile | grep 'hello'
hello #this will be highlightd

bu, arama eşleşmesini vurgulayacak ve üzerine düştüğü satırın tamamını görüntüleyecektir. Bu satırdan önce ve sonra satırları görüntülemek için -Ave -Btuşlarını kullanabilirim . Benim sorum komutu çalıştırmak ve tüm çıktıyı normal olarak görüntülemek mümkün, ancak grep gibi arama eşleşmelerini vurgulamak mümkün mü? bu yüzden çıkışım olurdu

hello #highlighted
there
my
friends

3
Daha iyi yanıtlar için , yalnızca eşleşmeleri (U&L) veya Renklendirilmiş grep'i değil, tüm dosyayı vurgulanmış eşleşmelerle (Yığın Taşması) görüntülemek için grep'i ikna etme konusuna bakın .
G-Man

Yanıtlar:


38

Yalnızca eşleşen desenleri vurgulamak, ancak çıktıyı başka şekilde değiştirmek için Renkli GREP kullanmak için:

grep --color=always -e "^" -e "hello" testfile

İlk kalıp tüm satırlarla eşleşecektir (tüm satırlar yazdırılacaktır) ikinci kalıp (ve sonraki kalıplar) eşleşen metnin renkli olarak vurgulanmasına neden olur.

İlk desen tüm satırlarla eşleştiğinden, ancak yazdırılabilir bir karakterle eşleşmediğinden, vurgulanan metnin okunabilirliği ile rekabet etmeyecek / karışmayacak şekilde renk vurgulaması eklemez.


Kubectl ile çalışır kubectl apply -k . | grep --color=always -e "^" -e "configured"zsh içinde
Michael Cole

Bash'te kullanım için: vurgula () {grep --color = always -e "^" -e $ *; }
Jon

Bu FreeBSD üzerinde de çalışır, sadece birinci ve ikinci paterni "^"değiştirmeniz gerekir (ikinci olması gerekir).
Marián Černý

26

-zGNU grep komutunuza seçenek ekleyin :

cat testfile | grep --color=always -z 'hello'

veya daha kısa

grep --color=always -z 'hello' testfile

3
Bu çok kaba bir hack. Tüm dosyaya tek bir satır gibi davranma etkisi vardır. Dosyası çok büyükse dosya deseni içermiyorsa nedenle, (1), bir bellek yetersiz çalışan olasılığını, ve (2) söz konusu olabilir hiç , sonra hiçbir şey çıkışı olacaktır.
G-Man,

Bu hangi grep sürümünü destekliyor? Grep 2.5.4'te, -z mevcut görünmüyor ...
Alex

@Alex: GNU grep 2.6.3 sürümünü kullandım.
Cyrus

2
@ G-Man: daha fazla kaynak tasarrufu:grep --color "hello\|$" file
Cyrus

@Cyrus: Evet, bu daha iyi bir cevap. Ne yazık ki, bot779'un bu soruya verdiği cevaba eşdeğerdir ve bağlantılı olduğum soruların kabul edilen cevaplarıyla ( 1 ve 2 ) neredeyse aynıdır .
G-Man,

5

Önceki cevaba benzer şekilde, tüm $satır sonlarını yakalayabilirsiniz :

cat testfile | grep --color -E "hello|$"

-E(veya --extended-regexp) özel karakterlerden kaçılması gerektiği anlamına gelir \. Kullanırken, |regex "VEYA" koşulu olarak kabul edilecektir.

Grep |$ayrıca sonu olan tüm satırları yakalar ve yazdırır, ancak $ gizli bir karakter olduğundan vurgulanamaz.

Güncelleme:

Eğer isterseniz tüm çıktıyı yazdırmak değil, aynı zamanda çıkış kodunu döndürür eşleşme bulunursa mediğine, sen perl komutu kullanabilirsiniz:

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

Sed'i tercih ederseniz - İşte tüm eşleşmeleri vurgulama + eşleşme bulunmadığında çıkış kodunu döndürme örneği : https://askubuntu.com/a/1200851/670392


2

Bu, GNBS grep ve FreeBSD'deki grep ile çalışır:

grep --color=always 'hello\|$'

\|Her satırın ( $) sonunda yazdırılamayan null dizesinin "merhaba" veya ( ) metniyle eşleşir . Bu yüzden her satır yazdırılır, ancak yalnızca "merhaba" vurgulanır.

Şansı zaten --color=autokabuğunuzda yapılandırmış olabilirsiniz. O zaman büyük olasılıkla şunları belirtmenize gerek yoktur --color=always:

grep 'hello\|$'

Ayrıca "veya" ifadesinin kaçmasına gerek olmayan egrep(genişletilmiş düzenli ifadelerle) kullanarak daha basit bir sürüm de kullanabilirsiniz |:

egrep 'hello|$'

Bu, tüm giriş satırlarının nasıl görüntüleneceğini yanıtlamaz.
Chris Page

@ChrisPage Bunu söyleyebilirim: Bu yüzden her satır yazdırılır, ancak yalnızca "merhaba" vurgulanır.
Marián Černý

0

Yukarıdaki en üstteki cevaba ekliyoruz. Yorumlarda belirtilen {} vurgulama işlevi, yalnızca veri içine eklendiğinde çalışır. Aşağıdaki takma ad, mükemmel olmasa da, daha yararlıdır:

alias greph="grep --color=always -e^ -e"

Bu, aşağıdaki gibi komutlarla çalışır:

greph foo bar.txt

cat bar.txt | greph foo
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.