Trong khi grep là một lệnh Linux nổi tiếng (chúng tôi đã đề cập chi tiết), bạn có biết rằng có hai biến thể khác nhau của công cụ này không? Có, đó là egrep và fgrep. Trong hướng dẫn này, chúng tôi sẽ thảo luận về biến thể sau (fgrep) bằng các ví dụ dễ hiểu. Nhưng trước khi làm điều đó, cần đề cập rằng tất cả các ví dụ và hướng dẫn được đề cập trong hướng dẫn này đều đã được thử nghiệm trên Ubuntu 16.04LTS.
Trong khi đó, đây là cú pháp của fgrep (giống như cú pháp của grep):
Và đây là cách trang hướng dẫn lệnh grep giải thích về công cụ này:
Các ví dụ theo kiểu Hỏi & Đáp sau đây sẽ giúp bạn hiểu rõ hơn về cách fgrep hoạt động.
Vì nó được cho là giống với grep -F, nên đây là cách một chuyên gia giải thích tùy chọn -F của grep tại StackExchange:
Và có một tệp khác (words.txt) chứa danh sách các từ mà chúng ta muốn tìm kiếm trong file1.
Vì vậy, đây là cách bạn có thể sử dụng fgrep để thực hiện tìm kiếm này:
Vì vậy, bạn có thể thấy các từ được tìm thấy đã được tô sáng màu đỏ. Bây giờ một số bạn có thể cho rằng đó cũng là những gì grep và egrep sẽ làm trong trường hợp này, vậy fgrep khác nhau như thế nào?
Đầu tiên, đúng, bạn đúng. Lệnh grep và egrep cũng sẽ tạo ra kết quả tương tự:
Nhưng sự khác biệt sẽ rõ ràng trong trường hợp file1 và words.txt chứa các nội dung sau (lưu ý các ký tự đặc biệt trong các từ):
Ở đây, egrep và grep sẽ không tìm thấy tất cả các từ:
Nhưng fgrep sẽ hoạt động như mong đợi:
"Điều này có nghĩa là
Lệnh fgrep của Linux
Nếu bạn xem tài liệu chính thức, trang hướng dẫn cho lệnh grep cho biết fgrep không gì khác ngoài grep -F. Nó cũng cho biết các biến thể như fgrep và egrep chỉ được cung cấp để tương thích ngược. Chúng ta sẽ đề cập đến những chi tiết này sau trong hướng dẫn này.Trong khi đó, đây là cú pháp của fgrep (giống như cú pháp của grep):
Mã:
grep [OPTIONS] PATTERN [FILE...]
Mã:
grep tìm kiếm các FILE đầu vào được đặt tên để tìm các dòng có chứa nội dung khớp với PATTERN đã cho. Nếu không có tệp nào
được chỉ định hoặc nếu tệp “-” được cung cấp, grep sẽ tìm kiếm đầu vào chuẩn. Theo mặc định, grep sẽ in
các dòng khớp.
Câu hỏi 1. fgrep khác với grep và egrep như thế nào?
Lệnh fgrep khác với cả grep và egrep ở chỗ nó diễn giải PATTERN là danh sách các chuỗi cố định (thay vì các biểu thức chính quy), được phân tách bằng các dòng mới.Vì nó được cho là giống với grep -F, nên đây là cách một chuyên gia giải thích tùy chọn -F của grep tại StackExchange:
Mã:
Công tắc [ICODE]-F[/ICODE] chuyển grep sang một chế độ khác, trong đó nó chấp nhận một mẫu để khớp, nhưng sau đó
chia mẫu đó thành một chuỗi tìm kiếm trên mỗi dòng và thực hiện tìm kiếm OR trên bất kỳ chuỗi nào
mà không thực hiện bất kỳ khớp mẫu đặc biệt nào.
Câu hỏi 2. Làm thế nào để sử dụng fgrep?
Để hiểu cách sử dụng fgrep, trước tiên chúng ta hãy lấy một ví dụ cơ bản. Giả sử có một tệp (file1) chứa các nội dung sau:Và có một tệp khác (words.txt) chứa danh sách các từ mà chúng ta muốn tìm kiếm trong file1.
Vì vậy, đây là cách bạn có thể sử dụng fgrep để thực hiện tìm kiếm này:
Mã:
fgrep -f words.txt file1
Vì vậy, bạn có thể thấy các từ được tìm thấy đã được tô sáng màu đỏ. Bây giờ một số bạn có thể cho rằng đó cũng là những gì grep và egrep sẽ làm trong trường hợp này, vậy fgrep khác nhau như thế nào?
Đầu tiên, đúng, bạn đúng. Lệnh grep và egrep cũng sẽ tạo ra kết quả tương tự:
Nhưng sự khác biệt sẽ rõ ràng trong trường hợp file1 và words.txt chứa các nội dung sau (lưu ý các ký tự đặc biệt trong các từ):
Ở đây, egrep và grep sẽ không tìm thấy tất cả các từ:
Nhưng fgrep sẽ hoạt động như mong đợi:
Câu hỏi 3. Có thực sự không có sự khác biệt nào giữa fgrep và grep không?
Theo tài liệu chính thức, không có bất kỳ sự khác biệt nào giữa fgrep và lệnh grep -F. Tuy nhiên, có thông tin cho rằng có một sự khác biệt chính giữa hai công cụ: thuật toán khớp chuỗi mà chúng sử dụng. Trong khi fgrep sử dụng thuật toán Aho-Corasick, grep sử dụng một phiên bản đã sửa đổi của Commentz-Walter."Điều này có nghĩa là
grep
có độ phức tạp tệ nhất là O(mn) trong khi fgrep
tệ nhất là O(m+n)," một chuyên gia trên diễn đàn StackExchange cho biết.