Để thêm vào câu trả lời xuất sắc của Steve.
Nó có thể không được nhiều người biết đến nhưng grep hầu như luôn nhanh hơn khi ghi xám cho một chuỗi mẫu dài hơn một chuỗi ngắn, bởi vì trong một mẫu dài hơn, Boyer-Moore có thể bỏ qua về phía trước trong những bước dài hơn để đạt được tốc độ tuyến tính con tốt hơn :
Thí dụ:
# after running these twice to ensure apples-to-apples comparison
# (everything is in the buffer cache)
$ time grep -c 'tg=f_c' 20140910.log
28
0.168u 0.068s 0:00.26
$ time grep -c ' /cc/merchant.json tg=f_c' 20140910.log
28
0.100u 0.056s 0:00.17
Dạng dài hơn nhanh hơn 35%!
Làm thế nào mà? Boyer-Moore cấu trúc một bảng chuyển tiếp từ chuỗi mẫu và bất cứ khi nào có sự không khớp, nó sẽ chọn lần bỏ qua dài nhất có thể (từ ký tự cuối đến ký tự đầu tiên) trước khi so sánh một ký tự trong đầu vào với ký tự trong bảng bỏ qua.
Đây là video giải thích về Boyer Moore (Tín dụng cho kommradHomer)
Một quan niệm sai lầm phổ biến khác (đối với GNU grep) fgrep
là nhanh hơn grep
. f
in fgrep
không có nghĩa là "nhanh", nó là viết tắt của "fixed" (xem trang người đàn ông), và vì cả hai đều là cùng một chương trình và cả hai đều sử dụng Boyer-Moore , không có sự khác biệt về tốc độ giữa chúng khi tìm kiếm fixed- chuỗi không có ký tự đặc biệt regexp. Lý do duy nhất mà tôi sử dụng fgrep
là khi có một regexp đặc biệt char (như .
, []
hoặc *
) Tôi không muốn nó được giải thích như vậy. Và thậm chí sau đó, hình thức di động / tiêu chuẩn grep -F
hơn được ưa thích hơn fgrep
.