Grep kullanarak tam dizgiyi eşleştir


63

Bir metin dosyasına sahibim:

deiauk 1611516 afsdf 765
minkra 18415151 asdsf 4152
linkra sfsfdsfs sdfss 4555
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4
deiauk 1611516 afsdf ddfgfgd
luktol1 4545 4 9
luktol 1

ve tam olarak eşleşmek istiyorum deiauk. Bunu yaptığımda:

grep "deiauk" file.txt

Bu sonucu alıyorum:

deiauk 1611516 afsdf 765
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4

ama sadece buna ihtiyacım var:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

Bir -wseçenek olduğunu biliyorum , ama daha sonra dizgimin bütün çizgiyi işlemesi gerekiyor.


4
Gerçekten denedin grep -wmi? (Bu seçenek tam olarak bu amaç içindir ve benim için çalışır.) - Not: seçenek -xtüm satırla eşleşir.
Janis

"Tam olarak eşleşmek istiyorumdeiauk / " Sadece buna ihtiyacım var: deiauk 1611516 afsdf 765" - hangisine ihtiyacınız var?
alex

Yanıtlar:


128

Şunlardan birini dene:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile

3
Dizenin sonunda bir tire ( - ) varsa, bu komut dosyası beklenmeyen bir sonuç olarak getirecektir.
Evis

Doğru @Evert: Kelimeler yalnızca alfa karakterleri, rakamlar ve alt çizgiler içerir, bu nedenle kısaltmalarınız veya tirelenmiş diğer öğeleriniz varsa, bu işe yaramaz.
saat

@Cyrus İkinciyi *kelimeler üzerinde vi / vim komutunu kullanırken öğrendim .
shuva

Bu örneğin sahip herhangi bir özel karakter için çalışmıyor org.apache.avro avroile greped org.apache.avro avro+mapred(* ile çalıştı)
Vishrant

12

Bunu GNU ile deneyin grepve kelime sınırlarını aşağıdakilerle işaretleyin \b:

grep "\bdeiauk\b" file

Çıktı:

deiauk 1611516 afsdf 765

Bakınız: http://www.regular-expressions.info/wordboundaries.html


Teşekkürler ama bu neden benim için çalışmıyor? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
user3334375

Deneyingrep "\b${vard}\b" file.txt
Cyrus

1
hala çalışmıyor: /
user3334375

İhtiyacınız olacak read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Cyrus

7

grepDestekleriniz varsa -P(PCRE) şunları yapabilirsiniz:

$ grep -P '(^|\s)\Kdeiauk(?=\s|$)' file.txt 
deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

4
Bu, tirelenmiş sözcüklerle çalışan tek cevaptır.
saat

5

Gerçek verilerinize bağlı olarak, ardından bir boşluk bırakan kelimeyi arayabilirsin:

grep 'deiauk ' file.txt 

Hattın başında olması gerektiğini biliyorsanız, kontrol edin:

grep '^deiauk ' file.txt 

Ne yazık ki, bunun dışındaki tüm cevaplar yanlış.
Shatu

@Shatu Teşekkürler! Öyleyse "en üste çıkın" ne kadar sürdüğünü görelim ... Merak ediyorum çünkü eski sorulara cevaplar eklemeyi seviyorum ... Sanırım öyle olduğunu sanıyorum, ama şüpheliyim. Benim için iyi olurdu, ama okuyucular için gerçekten yararlı. Bunu iyi bir örnek yapmak için, diğer cevapların eksikliğini özetleyen bir yorum yazmanızı isteyebilir miyim?
Volker Siegel

(1) 10 bin temsilciye ulaştığınız için tebrikler. Artık bu cevabın daha önce verildiğini ve silindiğini görme hakkınız var. (2) Bu dayanan, olabildiğince yaygın olarak soruyu cevaplamak için her zaman daha iyi söylenenlerin, sadece örnek verileri için çalışan bir cevap vermek değil. Sorudaki örnek verilere göre, sütunların boşluklarla ayrıldığı anlaşılıyor - ancak bu belirtilmemiş. Diğer tüm cevaplar sekmeyle ayrılmış sütunlar için de çalışacaktır. (3) Tachomi'nin (silinen) cevabındaki ölümcül kusurdan - ekleyerek ^- ama diğer tüm cevaplar işe yarıyordu … (devamı)
G-Man

(Devam))… string birinciden başka bir alanda görünüyorsa. (4) Ayrıca, diğer bütün cevaplar '' deiauk '' son alan ise işe yarar (yani ondan sonra hiçbir şey yoktur).
G-Man
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.