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
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.
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 , -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
$ 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 -Fbayrak yanlış.-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 $.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
-Fihtiyaç duyulmayacağını açıkladım ..
-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. ;)
-Fmevcuttu. ("Ya da -Fbayrak kullan grep"
-FYanı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.