Khớp chuỗi chính xác bằng grep


64

Tôi có một tập tin văn bản:

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

và tôi muốn khớp chính xác deiauk. Khi tôi làm điều này:

grep "deiauk" file.txt

Tôi nhận được kết quả này:

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

nhưng tôi chỉ cần điều này:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

Tôi biết có một -wtùy chọn, nhưng sau đó chuỗi của tôi phải mach toàn bộ dòng.


4
Bạn đã thực sự thử grep -wchưa? (Tùy chọn đó chính xác cho mục đích đó và nó hoạt động với tôi.) - Lưu ý: tùy chọn -xphù hợp với toàn bộ dòng.
Janis

"Tôi muốn khớp chính xácdeiauk / " Tôi chỉ cần cái này: deiauk 1611516 afsdf 765" - bạn cần cái gì?
alex

Câu trả lời:


129

Hãy thử một trong:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile

3
Nếu bạn có dấu gạch ngang ( - ) ở cuối chuỗi, tập lệnh này sẽ mang lại kết quả, điều này không được mong đợi.
Evis

Đúng @Evert: Các từ chỉ bao gồm ký tự alpha, chữ số và dấu gạch dưới, vì vậy nếu bạn có chữ viết tắt hoặc các mục khác được gạch nối, thì điều này không hoạt động.
ingyhere

@Cyrus Tôi đã học cái thứ hai trong khi sử dụng *lệnh vi / vim trên các từ.
shuva

Nó không hoạt động đối với bất kỳ ký tự đặc biệt nào, ví dụ như đã được org.apache.avro avrogreped org.apache.avro avro+mapred(đã thử với *)
Vishrant

12

Hãy thử điều này với GNU grepvà đánh dấu các ranh giới từ bằng \b:

grep "\bdeiauk\b" file

Đầu ra:

deiauk 1611516 afsdf 765

Xem: http://www.THER-expressions.info/wordboundaries.html


Cảm ơn nhưng tại sao điều này không làm việc cho tôi? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
dùng3334375

Hãy thửgrep "\b${vard}\b" file.txt
Cyrus

1
vẫn không hoạt động: /
user3334375

Bạn sẽ cần read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Cyrus

7

Nếu grephỗ trợ của bạn -P(PCRE), bạn có thể làm:

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

4
Đây là câu trả lời duy nhất hoạt động với các từ gạch nối.
ingyhere

5

Tùy thuộc vào dữ liệu thực của bạn, bạn có thể tìm từ theo sau bởi khoảng trắng:

grep 'deiauk ' file.txt 

Nếu bạn biết nó phải ở đầu dòng, hãy kiểm tra xem:

grep '^deiauk ' file.txt 

Đáng buồn thay, tất cả các câu trả lời khác hơn là không chính xác.
Shatu

@Shatu Cảm ơn! Vì vậy, hãy xem nó mất bao lâu để "bong bóng lên đến đỉnh" ... Tôi tò mò vì tôi muốn thêm câu trả lời cho các câu hỏi cũ ... Tôi nghĩ rằng nó được giả định là có, nhưng tôi nghi ngờ điều đó. Nó sẽ chỉ tốt cho tôi, nhưng thực sự hữu ích cho độc giả. Để làm cho điều này trở thành một ví dụ điển hình, tôi có thể yêu cầu bạn viết bình luận tóm tắt những câu trả lời khác không?
Volker Siegel

(1) Chúc mừng bạn đã đạt được 10 nghìn đại diện. Bây giờ bạn có đặc quyền để thấy rằng câu trả lời này đã được đưa ra trước đó và đã bị xóa. (2) Luôn luôn tốt hơn để trả lời câu hỏi càng rộng càng tốt, dựa trên những gì được nói và không đưa ra câu trả lời chỉ hoạt động cho dữ liệu mẫu. Từ dữ liệu mẫu trong câu hỏi, có vẻ như các cột được phân tách bằng dấu cách - nhưng điều đó không được chỉ định. Tất cả các câu trả lời khác cũng sẽ hoạt động cho các cột được phân tách bằng tab. (3) Bạn tránh được lỗ hổng chết người trong câu trả lời (xóa) tachomi của bằng cách thêm ^- nhưng tất cả các câu trả lời khác làm việc ... (Tiếp theo)
G-Man

(Tiếp theo) Nếu chuỗi xuất hiện trong một trường không phải là trường đầu tiên. (4) Ngoài ra, tất cả các câu trả lời khác đều hoạt động nếu '' deiauk '' là trường cuối cùng (nghĩa là không có gì sau nó).
G-Man
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.