it-swarm-vi.com

Sự khác biệt giữa `grep`,` egrep` và` fgrep` là gì?

Ai đó có thể cho tôi biết sự khác biệt về kỹ thuật giữa grep, egrepfgrep và cung cấp các ví dụ phù hợp không?

Khi nào tôi cần sử dụng grep over egrep và ngược lại?

287
mr_eclair
  • egrep tương đương 100% với grep -E
  • fgrep tương đương 100% với grep -F

Trong lịch sử các công tắc này được cung cấp trong các nhị phân riêng biệt. Trên một số hệ thống Unix thực sự cũ, bạn sẽ thấy rằng bạn cần gọi các nhị phân riêng biệt, nhưng trên tất cả các hệ thống hiện đại, các công tắc được ưu tiên. Trang người đàn ông cho grep có chi tiết về điều này.

Đối với những gì họ làm, -E chuyển grep sang chế độ đặc biệt để biểu thức được đánh giá là ERE (Biểu thức chính quy mở rộng) trái ngược với so khớp mẫu thông thường của nó. Chi tiết về cú pháp này là trên trang người đàn ông.

-E, --extended-regexp
[.__.] Giải thích THỰC TRẠNG như một biểu thức chính quy mở rộng

Các -F switch 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ỳ mô hình đặc biệt phù hợp.

-F, --fixed-strings
[.___.] Giải thích THỰC TRẠNG như một danh sách các chuỗi cố định, được phân tách bằng các dòng mới, bất kỳ chuỗi nào sẽ được khớp.

Dưới đây là một số tình huống ví dụ:

  • Bạn có một tệp với danh sách mười tên người dùng Unix ở dạng văn bản thuần túy. Bạn muốn tìm kiếm tệp nhóm trên máy của mình để xem liệu có ai trong số mười người dùng được liệt kê trong bất kỳ nhóm đặc biệt nào không:

    grep -F -f user_list.txt /etc/group
    

    Lý do -F switch giúp ở đây là tên người dùng trong tệp mẫu của bạn được hiểu là các chuỗi văn bản thuần túy. Các dấu chấm chẳng hạn sẽ được hiểu là các dấu chấm thay vì các ký tự đại diện.

  • Bạn muốn tìm kiếm bằng cách sử dụng một biểu thức ưa thích. Ví dụ: ngoặc đơn () có thể được sử dụng để chỉ các nhóm có | được sử dụng làm toán tử OR. Bạn có thể chạy tìm kiếm này bằng cách sử dụng -E:

    grep -E '^no(fork|group)' /etc/group
    

    ... để trả về các dòng bắt đầu bằng "nofork" hoặc "nogroup". Không có -E chuyển bạn sẽ phải thoát các ký tự đặc biệt có liên quan vì với khớp mẫu bình thường, họ sẽ chỉ tìm kiếm mẫu chính xác đó;

    grep '^no\(fork\|group\)' /etc/group
    
304
Caleb

Từ man grep:

[.__.] egrep giống như grep -E. [.__.] fgrep giống như grep -F. Yêu cầu trực tiếp dưới dạng egrep hoặc [.__.] Fgrep không được chấp nhận, nhưng được cung cấp để cho phép các ứng dụng lịch sử [.__.

Bạn sử dụng fgrep hoặc grep -F nếu bạn không muốn chuỗi grepping được hiểu là một mẫu.

Bạn sử dụng egrep hoặc grep -E nếu bạn cần sử dụng một biểu thức chính mở rộng.

33
rozcietrzewiacz

egrepfgrep về cơ bản tương đương với grep -Egrep -F (tương ứng):

   -E, --extended-regexp
          Interpret PATTERN as an extended regular  expression  (ERE,  see
          below).  (-E is specified by POSIX.)

   -F, --fixed-strings
          Interpret  PATTERN  as  a  list  of  fixed strings, separated by
          newlines, any of which is to be matched.  (-F  is  specified  by
          POSIX.)

Thông báo lỗi có thể khác nhau mặc dù.

15
Stéphane Gimenez

Từ "người đàn ông grep":

ba chương trình biến thể egrep, fgrep và rgrep có sẵn. egrep giống như grep -E. fgrep giống như grep -F. rgrep giống như grep -r. Yêu cầu trực tiếp như egrep hoặc fgrep không được chấp nhận, nhưng được cung cấp để cho phép các ứng dụng lịch sử dựa vào chúng chạy không thay đổi.

8
Rufo El Magufo

Nếu bạn tìm kiếm một chuỗi nguyên văn và muốn chắc chắn rằng chuỗi bạn đã vượt qua được hiểu nguyên văn (nghĩa là không có nguy cơ nói rằng dấu chấm hoặc dấu hỏi sẽ được hiểu là một thứ khác), hãy sử dụng fgrep hoặc egrep -F.

Đối với sự khác biệt giữa egrep và grep, tôi nghĩ rằng egrep hầu hết là điều bạn muốn. Trang web GNU thủ công liệt kê sự khác biệt giữa grep và egrep dường như nằm trong cú pháp: một số thứ yêu cầu gạch chéo trong khi những thứ khác thì không. Tôi nghĩ rằng egrep là nhiều hơn "tương thích" với regexps Perl và regexps javascript để tôi dễ sử dụng egrep hơn.

Btw. Tôi thực sự khuyến khích bạn cung cấp ack một lần thử - nó hỗ trợ PREGs và có các mặc định hữu ích hơn (ví dụ như tô màu, bỏ qua các thư mục có thể không phải là những gì bạn muốn như .svn, khả năng theo liên kết tượng trưng, và gõ ack dễ hơn một chút so với grep -E).

3
qbolec