Cocokkan string yang tepat menggunakan grep


65

Saya punya file teks:

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

dan saya ingin mencocokkan persis deiauk. Ketika saya melakukan ini:

grep "deiauk" file.txt

Saya mendapatkan hasil ini:

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

tapi aku hanya butuh ini:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

Saya tahu ada -wpilihan, tetapi kemudian string saya harus mach seluruh baris.


4
Sudahkah Anda mencoba grep -w? (Opsi itu tepat untuk tujuan itu, dan itu bekerja untuk saya.) - Catatan: opsi -xcocok dengan seluruh baris.
Janis

"Aku ingin benar-benar cocokdeiauk / " Aku hanya butuh ini: deiauk 1611516 afsdf 765" - mana yang kamu butuhkan?
alex

Jawaban:


129

Coba salah satu dari:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile

3
Jika Anda memiliki tanda hubung ( - ) di akhir string, skrip ini akan membawanya sebagai hasilnya, yang tidak diharapkan.
Evis

@Evert Benar: Kata-kata hanya menyertakan karakter alfa, digit, dan garis bawah, jadi jika Anda memiliki singkatan atau item lain yang ditulis dgn tanda penghubung, ini tidak berfungsi.
ingyhere

@Cyrus Saya belajar yang kedua saat menggunakan *perintah vi / vim pada kata-kata.
shuva

Ini tidak berfungsi untuk karakter khusus yang dimilikinya, misalnya, org.apache.avro avrodiraih org.apache.avro avro+mapred(dicoba dengan *)
Vishrant

12

Coba ini dengan GNU grepdan tandai batas kata dengan \b:

grep "\bdeiauk\b" file

Keluaran:

deiauk 1611516 afsdf 765

Lihat: http://www.regular-expressions.info/wordboundaries.html


Terima kasih tetapi mengapa ini tidak berhasil untuk saya? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
user3334375

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

1
masih tidak berfungsi: /
user3334375

Anda akan membutuhkan read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Cyrus

7

Jika grepdukungan Anda -P(PCRE), Anda dapat melakukan:

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

4
Ini adalah satu-satunya jawaban yang bekerja dengan kata-kata yang ditulis dgn tanda penghubung.
ingyhere

5

Bergantung pada data Anda yang sebenarnya, Anda bisa mencari kata yang diikuti oleh spasi:

grep 'deiauk ' file.txt 

Jika Anda tahu itu harus di awal baris, periksa untuk itu:

grep '^deiauk ' file.txt 

Sayangnya, semua jawaban selain ini salah.
Shatu

@ Shatu Terima kasih! Jadi mari kita lihat berapa lama untuk "menggelembung ke atas" ... Saya ingin tahu karena saya ingin menambahkan jawaban untuk pertanyaan lama ... Saya pikir itu dianggap benar, tetapi saya meragukannya. Itu akan baik bagi saya, tetapi sebenarnya bermanfaat bagi pembaca. Untuk menjadikan ini contoh kasus yang baik, dapatkah saya meminta Anda untuk menulis komentar yang meringkas apa yang tidak ada jawaban lainnya?
Volker Siegel

(1) Selamat telah mencapai 10 ribu perwakilan. Anda sekarang memiliki hak istimewa untuk melihat bahwa jawaban ini diberikan sebelumnya, dan telah dihapus. (2) Selalu lebih baik untuk menjawab pertanyaan seluas mungkin, berdasarkan apa yang dikatakan, dan tidak memberikan jawaban yang hanya berfungsi untuk data sampel. Tampaknya, dari contoh data dalam pertanyaan, bahwa kolom dipisahkan oleh spasi - tetapi itu tidak ditentukan. Semua jawaban lain juga akan berfungsi untuk kolom yang dipisahkan tab. (3) Anda menghindari kesalahan fatal dalam jawaban tachomi (dihapus) dengan menambahkan ^- tetapi semua jawaban lainnya berhasil ... (Lanjutan)
G-Man Mengatakan 'Reinstate Monica'

(Lanjutkan) ... jika string muncul di bidang selain yang pertama. (4) Juga, semua jawaban lain berfungsi jika '' deiauk '' adalah bidang terakhir (yaitu, tidak ada yang sesudahnya).
G-Man Mengatakan 'Reinstate Monica'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.