Grep sadece tüm satır eşleştiğinde nasıl eşleşir?


104

Bende bunlar var:

$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123

ABB.log'un tam eşleşmesini bulmak istedim.

Ama yaptığımda

$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123

hepsini gösterir.

Grep kullanarak istediğimi alabilir miyim?

Yanıtlar:


105

Basitçe regexp bağlantılarını belirtin.

grep '^ABB\.log$' a.tmp

2
Her iki çapa (^ ve $) da gereklidir.
user562374

2
Güzel bir! Ve bir dosyadan eşleştirme için normal ifadeyi kullanıyorsam? "grep -f kalıpları a.tmp" ??
green69

@ green69 Birkaç yıl geç, ancak desenleri sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
grep'e

156
grep -Fx ABB.log a.tmp

Grep man sayfasından:

-F, --fixed-strings PATTERN'i
sabit dizeler (listesi) olarak yorumlayın
-x, --line-regexp
Yalnızca tüm satırla tam olarak eşleşen eşleşmeleri seçin.


2
maalesef -F kullanamadı.
Johnyy 18'11

@Johnyy Hayır -F? Solaris'te misin? Öyleyse kullanın/usr/xpg4/bin/grep
Scrutinizer

9
grepBir bash betiğinin içinde kullanıyorum ve bu seçenek, kabul edilen yanıtta önerildiği gibi normal bir ifade kullanmaktan daha iyidir. Çünkü aradığım değişkenin içinde özel bir karakter var (beğeniyorum .) ve komutu kullanırken onlardan kaçmam gerekmiyor.
Gustavo Straube

1
en iyi yanıt
IMO'su

1
Bu daha iyidir çünkü değişkenlerle de çalışır.
ybenjira

23

Yaptığım şey şu, ancak çapa kullanmak en iyi yol:

grep -w "ABB.log " a.tmp

Bunun gibi .. İlk satır eşleşmesini döndürür
user765443

1
Bu, sonrasında bir boşluk gerektirir ABB.log, ki bu genel durum değildir, yani çoğu zaman başarısız olur.
Jahid

3

Dosya elle düzenleniyorsa önemli olan tek bir önde veya arkada boşluk varsa çoğu öneri başarısız olur. Bu, bu durumda onu daha az duyarlı hale getirir:

grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp

Kabuktaki basit bir while-read döngüsü bunu dolaylı olarak yapacaktır:

while read file
do 
  case $file in
    (ABB.log) printf "%s\n" "$file"
  esac
done < a.tmp


1

OP'nin girişimleri ve diğer cevaplarla ilgili bazı ekstra açıklamalar eklemek niyetindeyim.

Sen kullanabilirsiniz John Kugelmans' çözümü çok böyle:

grep -x "ABB\.log" a.tmp

dizeyi tırnak içine almak ve noktadan ( .) kaçmak , -Fbayrağa artık ihtiyaç duymamasını sağlar .

.(Nokta) işaretinden kaçmanız gerekir (çünkü herhangi bir karakterle eşleşir (sadece .kaçmazsa) veya -Fgrep ile bayrağı kullanmanız gerekir . -Fflag onu sabit bir dize yapar (bir normal ifade değil).

Dizeyi tırnak içine almazsanız, nokta ( .) karakterinden kaçmak için çift ters eğik çizgiye ihtiyacınız olabilir :

grep -x ABB\\.log a.tmp


Ölçek:

$ echo "ABBElog"|grep -x  ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x  "ABB\.log"
#returns empty string, no match


Not:

  1. -x tüm çizgiye uyacak kuvvetler.
  2. Kaçan olmayan bir kullanmadan Cevapları .olmadan -Fbayrak yanlış.
  3. -xDesen dizenizi ^ve ile kaydırarak geçiş yapmaktan kaçınabilirsiniz $. Bu durumda marka olarak emin Kullanmadığınız -Fkaçmak yerine, .çünkü -Fdüzenli ifadeli yorumunu önleyecektir ^ve $.


DÜZENLEME: (@hakre ile ilgili ekstra açıklama ekleniyor):

Eğer ile başlayan bir dizge ile eşleşmek istiyorsanız , grep ile -kullanmalısınız --. Aşağıdakiler --girdi olarak alınacaktır (seçenek değil).

Misal:

echo -f |grep -- "-f"     # where grep "-f" will show error
echo -f |grep -F -- "-f"  # whre grep -F "-f" will show error
grep "pat" -- "-file"     # grep "pat" "-file" won't work. -file is the filename

Durumunuzda -F'nin eksik olduğunu gerçekten deneyimlediniz mi? Eğer öyleyse, lütfen bunun hangi dava olduğunu söyleyebilir misiniz?
hakre

@hakre Cevabımı tamamen okudunuz mu? (Oldukça açık bir şekilde) doğru şekilde kaçılırsa neden -Fihtiyaç duyulmayacağını açıkladım ..
Jahid

Elbette. Elbette, sadece soruyorum: -FBunu yazarken müsait miydi ? Değilse, hangi sistemi kullanıyordunuz? Şu ana kadar cevabınızda bu bilgiyi bulamadım, bu bilgiyi tekrar okuduğumda şimdi bile durum böyledir. Gerçekten eminim, cevabınızı en az iki kez tamamen okudum. ;)
hakre

@hakre Elbette -Fmevcuttu. ("Ya da -Fbayrak kullan grep"
dedim

Görüş için teşekkürler. Geriye sadece bir küçük soru kalıyor: -FYanıt buysa , neden kaçmayı düşünelim? Bununla ilgili fikriniz nedir?
hakre

1

Benzer bir şey yapmaya çalışırken bu benim için iyi çalıştı:

grep -F ABB.log a.tmp

-1
    $ cat venky
    ABB.log
    ABB.log.122
    ABB.log.123

    $ cat venky | grep "ABB.log" | grep -v "ABB.log\."
    ABB.log
    $

    $ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
    ABB.log.122
    $

1
Bu aynı zamanda ABB.log ile biten dosyalarla da eşleşecektir ve noktaların kaçılması gerekir.
Scrutinizer

-1

Benim için çalışıyor :

grep "\bsearch_word\b" text_file > output.txt  

\b sınırları gösterir / belirler.

Oldukça hızlı çalışıyor gibi görünüyor


Bu search_word, kelime sınırlarıyla ayrılmış herhangi bir satırla da eşleşir . Örneğin, "foo search_word bar" satırıyla eşleşir.
Rohan Singh

-2

Bu, HPUX ile, dosyaların içeriğinde sözcükler arasında boşluk varsa, şunu kullanın:

egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp


OP, satır içinde boşlukla sınırlı bir kelimeyi değil, tüm satırı eşleştirmek istedi.
Keith Thompson


-3

Bu özelliğe ihtiyacım vardı, ancak aynı zamanda ABB.log'dan önce ön ekli satırları döndürmediğimden emin olmak istedim:

  • ABB.log
  • ABB.log.122
  • ABB.log.123
  • 123ABB.log

grep "\WABB.log$" -w a.tmp

Bu yalnızca \W, boşluk olmayan herhangi bir karakter olan baştaki tatmin edildiyse eşleşecektir , bu yüzden xABBxlog.
bschlueter
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.