Grep cho chuỗi chữ


100

Tôi đang theo đuổi một công cụ kiểu grep để tìm kiếm các chuỗi hoàn toàn theo nghĩa đen. Tôi đang tìm kiếm sự xuất hiện của một dòng trong tệp nhật ký, như một phần của một dòng trong tệp nhật ký riêng biệt. Các văn bản tìm kiếm có thể chứa tất cả các loại ký tự đặc biệt regex, ví dụ []().*^$-\.

Có tiện ích tìm kiếm Unix không sử dụng regex mà chỉ tìm kiếm các lần xuất hiện theo nghĩa đen của một chuỗi không?


Tự hỏi tại sao câu hỏi không phải là "Tôi có thể thực hiện greptìm kiếm các chuỗi theo nghĩa đen không?" thay vì "Có thứ gì như grepvậy có thể tìm kiếm các chuỗi theo nghĩa đen không?" Bạn biết đấy, tua vít đầu phẳng có thể vừa vặn với đầu vặn vít của Philips;)
ADTC

Câu trả lời:


135

Bạn có thể sử dụng grep cho điều đó, với tùy chọn -F.

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings

"chuỗi cố định được phân tách bằng dòng mới" Làm cách nào để thực hiện việc này trên dấu nhắc đầu cuối? Tôi biết mình có thể tạo tệp mẫu, nhưng không có tệp, liệu có thể thực hiện trên lời nhắc không? Nhấn Enter rõ ràng sẽ thực hiện lệnh.
ADTC

13
Tôi sẽ trả lời câu hỏi của riêng tôi. :) Bạn chỉ cần cung cấp nhiều chuỗi cố định bằng cách sử dụng lặp lại -etùy chọn. Như thế này: grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4". Không yêu cầu dòng mới;)
ADTC

2
Không có sẵn trên Solaris. Thay vào đó fgrepđược sử dụng.
majkinetor

2
@ADTC Tôi phát hiện ra rằng tôi phải sử dụng dấu ngoặc kép cho chuỗi được tìm kiếm chỉ chứa các ký tự đặc biệt, nếu không sẽ không tìm thấy gì. Vì vậy, điều này không trả về kết quả nào: grep --include=\*.php -FRn -e "$$"Sử dụng quoutes đơn đã cho tôi kết quả mong muốn:grep --include=\*.php -FRn -e '$$'
Piemol

2
Bạn đúng @ADTC. $và một số ký tự khác là đặc biệt và chúng sẽ được thay thế bằng bash sau khi bạn nhấn enter và trước khi grep(hoặc bất kỳ lệnh nào) được thực thi. Bạn có thể yêu cầu bash để nguyên tất cả các ký tự (ngoại trừ một dấu ngoặc kép) bằng cách đặt chúng bên trong dấu ngoặc kép. Nếu bạn cần nhập một trích dẫn duy nhất, hãy làm như thế này'I'\''m special'
ndemou

14

Đó là một trong hai fgrephoặc grep -Fsẽ không thực hiện biểu thức chính quy. fgrepgiống hệt grep -Fnhưng tôi thích không phải lo lắng về các đối số, về bản chất là lười biếng :-)

grep   ->  grep
fgrep  ->  grep -F  (fixed)
egrep  ->  grep -E  (extended)
rgrep  ->  grep -r  (recursive, on platforms that support it).

Đối với GNU grep, fgrep chỉ là cung cấp như một liên kết tượng trưng đến grep mà làm cho nó mất -F
Daenyth

3
egrepfgrepkhông được chỉ định bởi tiêu chuẩn POSIX; grep -Fgrep -E
Richard Hansen,


3

bạn cũng có thể sử dụng awk, vì nó có khả năng tìm chuỗi cố định, cũng như khả năng lập trình, ví dụ: chỉ

awk '{for(i=1;i<=NF;i++) if($i == "mystring") {print "do data manipulation here"} }' file

2
cat list.txt
one:hello:world
two:2:nothello

three:3:kudos

grep --color=always -F"hello

three" list.txt

đầu ra

one:hello:world
three:3:kudos

2
Tôi không đồng ý. Đó là một minh họa hữu ích về cách hoạt động của nó.
timwaagh
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.