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:
Basitçe regexp bağlantılarını belirtin.
grep '^ABB\.log$' a.tmp
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
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.
-F
? Solaris'te misin? Öyleyse kullanın/usr/xpg4/bin/grep
grep
Bir 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.
Yaptığım şey şu, ancak çapa kullanmak en iyi yol:
grep -w "ABB.log " a.tmp
ABB.log
, ki bu genel durum değildir, yani çoğu zaman başarısız olur.
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
awk ile benzer şekilde
awk '/^ABB\.log$/' file
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 , -F
bayrağ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 -F
grep ile bayrağı kullanmanız gerekir . -F
flag 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
$ echo "ABBElog"|grep -x ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x "ABB\.log"
#returns empty string, no match
-x
tüm çizgiye uyacak kuvvetler..
olmadan -F
bayrak yanlış.-x
Desen dizenizi ^
ve ile kaydırarak geçiş yapmaktan kaçınabilirsiniz $
. Bu durumda marka olarak emin Kullanmadığınız -F
kaçmak yerine, .
çünkü -F
düzenli ifadeli yorumunu önleyecektir ^
ve $
.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
-F
ihtiyaç duyulmayacağını açıkladım .
.
-F
Bunu 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. ;)
-F
mevcuttu. ("Ya da -F
bayrak kullan grep
"
-F
Yanıt buysa , neden kaçmayı düşünelim? Bununla ilgili fikriniz nedir?
Benzer bir şey yapmaya çalışırken bu benim için iyi çalıştı:
grep -F ABB.log a.tmp
$ 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
$
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
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.
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
Bu özelliğe ihtiyacım vardı, ancak aynı zamanda ABB.log'dan önce ön ekli satırları döndürmediğimden emin olmak istedim:
grep "\WABB.log$" -w a.tmp
\W
, boşluk olmayan herhangi bir karakter olan baştaki tatmin edildiyse eşleşecektir , bu yüzden xABBxlog
.