Đọc các mẫu grep từ một tệp


49

Tôi có một vài tệp văn bản lớn và trong tệp UNIQS.txttôi có một danh sách các chuỗi greptừ một tệp khác. Mã tôi sử dụng là

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

không có gì - tập tin được tạo ra là trống rỗng. Nhưng khi tôi làm

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

nó hoạt động chính xác. Điều này làm tôi bối rối bởi vì tôi không nghĩ grepsẽ diễn giải các mục trong UNIQS.txtcác mẫu regrec mà không có dấu ngoặc kép và dấu gạch chéo và cứ thế nằm trong tệp (không có). Có phải nói chung là nếu bạn nhận được các mẫu từ một tệp thì nó sẽ tự động nghĩ rằng chúng là các mẫu regrec?

Chỉnh sửa: Trong UNIQS.txttệp, có các chuỗi phân tách dòng mới của biểu mẫu

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(được gọi là tên mẫu) và các EEP_VSL...cột tệp được phân tách bằng các cột, với khoảng 14 cột và cột đầu tiên là tên mẫu, vì vậy về cơ bản tôi muốn trích xuất dòng tương ứng với từng mẫu trong tệp.

Câu trả lời:


60

Các -ftùy chọn chỉ định một tập tin mà grep đọc mẫu. Điều đó giống như chuyển các mẫu trên dòng lệnh (với -etùy chọn nếu có nhiều hơn một), ngoại trừ khi bạn gọi từ shell, bạn có thể cần trích dẫn mẫu để bảo vệ các ký tự đặc biệt trong nó khỏi bị mở rộng bởi shell.

Đối số -Ehoặc -Fhoặc -P, nếu có, nói với grep mà cú pháp các mô hình được viết bằng Khi không có đối số, grep hy vọng. Biểu thức thông thường cơ bản ; với -E, grep mong đợi các biểu thức chính quy mở rộng ; với -P(nếu được hỗ trợ), grep mong đợi các biểu thức chính quy Perl ; và với -F, grep mong đợi các chuỗi chữ. Cho dù các mẫu đến từ dòng lệnh hoặc từ một tệp không quan trọng.

Lưu ý rằng các chuỗi là chuỗi con: nếu bạn chuyển qua a+bdưới dạng mẫu thì một dòng chứa có a+b+ckhớp. Nếu bạn muốn tìm kiếm các dòng chứa chính xác một trong các chuỗi được cung cấp và không còn nữa, thì hãy chuyển -xtùy chọn.


1
Được rồi, cảm ơn rất hữu ích. Tôi có thể hỏi, giả sử rằng tôi muốn khớp chính xác chuỗi, tức là nếu chuỗi là 12345 thì tôi chỉ muốn khớp với 12345, không phải trên 123456 hoặc 123455, v.v., tôi sẽ làm thế nào?
sdf

2
@sdf Đọc đoạn cuối của tôi:-x
Gilles 'SO- ngừng trở nên xấu xa'

Điều này là quá cũ, xin lỗi vì đã đào nó ra. Mặc dù lời giải thích ở trên là tuyệt vời, nhưng có một chút mơ hồ về lý do tại sao các mẫu (chuỗi) từ tệp không khớp mà không có -Fcờ. Tôi đoán là -trong dòng mẫu ở trên khiến điều này được đọc như một chuỗi các ký tự? Điều đó có yêu cầu dấu ngoặc vuông không? Tôi đã thử nghiệm với một số tệp mẫu nhưng chưa đưa ra kết luận.
trs

@trs Dòng hiển thị trong câu hỏi (được thêm vào sau khi tôi đăng câu trả lời của mình) không chứa bất kỳ ký tự nào có ý nghĩa đặc biệt trong biểu thức chính quy, vì vậy nó hoạt động giống và không -F. Nó sẽ làm cho một sự khác biệt với các nhân vật như \[*^$.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles cảm ơn, đó cũng là ấn tượng của tôi nhưng @sdf tuyên bố "tệp được tạo trống" (đọc: không khớp) mà không có -Fcờ?
trs

0

Tôi đã có cùng một lỗi, không được giải quyết với câu trả lời tốt từ @gilles. Nhìn gần hơn trong tập tin đầu vào, tôi tìm thấy 2 dòng mới ở cuối. Nếu không có những thứ này, chỉ cần thành công: grep -i file_potype_input

(GNU grep 3.1, Tệp đầu vào hơn 5000 bản ghi, tệp khớp / mẫu 2536, tôi biết tất cả 2536 phải có trong tệp. Với dòng mới có tất cả các dòng của tệp và không chỉ có 2536 dòng phù hợp)


1
Điều đó không liên quan đến vấn đề của OP. Một dòng trống được đọc bởi grep dưới dạng một mẫu trống và một mẫu trống khớp với mọi nơi.
muru
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.