egrep: ví dụ về lệnh trong GNU / Linux

ví dụ

grep nó là một trong những công cụ được sử dụng nhiều nhất trên dòng lệnh GNU / Linux. Mặc dù là một công cụ rất đơn giản nhưng nó cho phép bạn thực hiện một số lượng lớn các thao tác. Nó được sử dụng đặc biệt cùng với các đường ống, để có thể xác định vị trí các điểm cụ thể trong đầu ra của lệnh trước đó, v.v. Nhưng cũng có một công cụ được gọi là egrep, tương đương với việc chạy grep với tùy chọn -E.

Chữ e đến từ "Extended regex", là thứ kích hoạt tùy chọn -E và những gì bạn có trong egrep theo mặc định mà không sử dụng tùy chọn đó. Đó là, bạn có thể sử dụng biểu thức chính quy mở rộng. Trong hướng dẫn này, tôi sẽ không đi vào giải thích các biểu thức chính quy là gì, cách chúng có thể được sử dụng và các loại trong * nix. Tôi sẽ chỉ cho bạn thấy những ví dụ thực tế về một số điều hữu ích mà bạn có thể làm với egrep ...

grep, egrep và fgrep cũng tương tự như vậy. Trên thực tế, egrep tương đương với grep -E và fgrep tương đương với grep -F. Nghĩa là, trong trường hợp liên quan đến chúng tôi, nó cũng sẽ diễn giải các mẫu dưới dạng biểu thức chính quy.

Anh tìm kiếm một dòng hoặc từ trong một hoặc nhiều tệp, cũng như trường hợp với grep. Ví dụ: giả sử bạn muốn tìm kiếm từ ubuntu trong một tệp có tên là snap.txt và cả trong tất cả các tệp .txt trong thư mục hiện tại:

egrep ubuntu snap.txt

egrep ubuntu *.txt

Tìm kiếm cũng có thể đệ quy Để tìm kiếm toàn bộ nội dung của thư mục hiện tại:

egrep -r "hola mundo" *

Cho đến nay, các từ hoặc chuỗi chính xác đã được tìm kiếm, nghĩa là, có tính đến chữ hoa và chữ thường (phân biệt chữ hoa chữ thường), nhưng nếu bạn muốn làm điều đó ở chế độ không phân biệt chữ hoa chữ thường, không cần biết chúng là chữ hoa hay chữ thường, bạn có thể sử dụng như sau (nếu bạn thêm w, nó chỉ tìm thấy các kết quả phù hợp hoàn chỉnh):

egrep -i "ejemplo" documento.txt

egrep -iw "ejemplo" documento.txt

Cho thấy, không phải là sự trùng hợp, nhưng tên tệp nơi các kết quả trùng khớp đó được tìm thấy:

egrep -l hola *.txt

Chỉ hiển thị mẫu hoặc từ đã tìm kiếm trong một tài liệu:

egrep -o printf hola.c

Hãy nhớ rằng bạn có thể sử dụng tất cả các khả năng mà bạn có thể tưởng tượng. Bạn có thể kết hợp một số tùy chọn đã thấy trước đó hoặc bạn có thể bổ sung chúng bằng các tùy chọn khác như -A n và -B n, trong đó n số dòng bạn muốn hiển thị trước (Trước) và sau (Sau) của trận đấu hoặc cả hai cùng một lúc (C), để bạn có thể thấy những gì xung quanh trận đấu:

egrep -A 2 "printf" hola.c

egrep -B 2 "printf" hola.c

egrep -C 2 printf hola.c

Loại bỏ các dòng có chứa kết quả phù hợp và chỉ hiển thị các dòng không khớp:

egrep -v "dos" números.doc

Hoặc nếu bạn thích, bạn có thể sử dụng nhiều từ hoặc kết hợp với -e. Ví dụ:

egrep -v -e "uno" -e "dos" -e "tres" números.txt

Nếu bạn sử dụng -c chỉ có thể đếm số trận đấuhoặc đảo ngược nó với -v để hiển thị số dòng không khớp. Ví dụ:

egrep -c "include" main.c

egrep -v -c "include" main.c

Và ngay cả hiển thị số dòng nơi trận đấu đã xảy ra và cả vị trí nó chiếm tương ứng:

egrep -n "void" hola.c

egrep -o -b "printf" hola.c

Và cùng với biểu thức chính quy khả năng của nó có thể được mở rộng. Ví dụ: tìm một dòng bắt đầu bằng Xin chào và kết thúc bằng tạm biệt hoặc dòng bắt đầu bằng Xin chào theo sau là bất cứ điều gì và sau đó câu tạm biệt xuất hiện tương ứng:

* Sửa lệnh sau: nhờ góp ý của độc giả Manuel Alcocer mà mình sửa được lệnh sau, do có lỗi.

egrep '^Hola.*adiós$' ejemplo.txt

egrep "Hola.*adiós" ejemplo.txt

Nhưng nếu bạn thắc mắc về sự khác biệt với grep, đây là một ví dụ sẽ giúp bạn rõ hơn ... Trong trường hợp sử dụng grep mà không có -E, bạn nên sử dụng trình tự thoát để nó diễn giải các ký tự đặc biệt như vậy, nếu không nó sẽ diễn giải mẫu như vậy mà không tính đến chúng. Mặt khác, với egrep hoặc grep -E, nó sẽ tính đến chúng. Ví dụ:
grep '^no\(fork\|group\)' /etc/group

Điều đó sẽ tương đương với:

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

Đó là, nó sẽ tìm kiếm các dòng phù hợp bắt đầu bằng nofork hoặc nogroup. Nhưng nếu bạn sử dụng biểu thức đầu tiên của grep mà không có các chuỗi thoát, những gì nó sẽ làm là tìm kiếm mô hình cụ thể no (fork | group):

grep 'no(fork|group)' /etc/group

Bạn cũng có thể tìm kiếm dãy chữ và sốhoặc các giá trị cụ thể, chẳng hạn như để định vị các IP nhất định:
cat /etc/networks | egrep "192.168.1.[5-9]"
cat /etc/networks | egrep "192.168.[1-3].[5-9]"
cat /etc/networks | egrep "192.168.1.[0-3]|[5-9]"
egrep 192.168.4.[10,40] networks

Nếu muốn, bạn có thể sử dụng các cụm từ thông dụng khác để thực hiện các tìm kiếm cụ thể hơn. Ví dụ | để tìm một trùng hợp hay khác:

egrep -i '^(printf|scanf)' hola.c

Bạn thậm chí có thể xác định vị trí Chỉ chữ hoa, chữ thường, ký tự chữ cái hoặc chữ và số, v.v., sử dụng các biểu thức khác như: [: alnum:], [: alpha:], [: digit:], [: low:], [: print:], [:unct:], [: space:], [ : trên:], v.v. Ví dụ: để tìm kiếm chữ hoa:
egrep [[:upper:]] diccioario

Tôi hy vọng nó sẽ giúp bạn ... Tôi sẽ sớm giải thích các biểu thức chính quy trong một bài viết dành riêng cho nó ...


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   Manuel Alcoholcer dijo

    Xin chào buổi chiều.

    Một vài nhận xét ...

    Bạn giải thích lệnh 'egrep' nhưng không đặt sự khác biệt giữa 'egrep' và 'grep', đó sẽ là những gì nó ở đây.

    Ví dụ:
    Với grep: ip -4 a | grep '[0-9] \ +'
    Với egrep: ip -4 a | egrep '[0-9] +'

    Ahh, và điều này là sai, 'egrep "Xin chào. * Tạm biệt" example.txt'; thành công ở đây xảy ra khi có một dòng trong tệp chứa chuỗi 'Xin chào', theo sau là bất cứ thứ gì và theo sau là 'tạm biệt', dòng thực sự có thể bắt đầu và kết thúc bằng bất cứ điều gì.

    Đây sẽ là những gì bài báo nói:
    egrep '^ Xin chào. * bye $' example.txt

    Và tất cả các tùy chọn, hoặc gần như tất cả (tôi không dừng lại để kiểm tra nó), là các tùy chọn của 'grep' chứ không phải của 'egrep' dành riêng.

    Trân trọng.

    1.    Isaac dijo

      Cảm ơn bạn đã báo cáo lỗi đó. Những gì bạn nhận xét về biểu thức chính quy, tôi đã đưa nó vào đoạn thứ hai. Tôi sẽ dành một bài báo cụ thể cho họ, bởi vì có rất nhiều và bài viết này sẽ mất quá nhiều thời gian. Một lời chào!

      1.    Manuel Alcoholcer dijo

        Xin chào một lần nữa, Isaac.

        Trong đoạn thứ hai về cơ bản, bạn nói, hoặc lẽ ra phải nói, rằng 'egrep' là một bí danh của 'grep -E', nhưng bạn không đưa ra bất kỳ ví dụ nào về việc sử dụng 'egrep' với một số cụm từ thông dụng được viết khác với khi được sử dụng bởi 'grep'.

        Dành riêng một bài báo để giải thích cụm từ thông dụng mở rộng dường như là điều tôi không dám, trong số những thứ khác vì có những trang web như thế này không quảng cáo và đang thực hiện công việc cung cấp thông tin rất quan trọng cho cộng đồng GNU: https://www.rexegg.com/

        Tôi không viết ở đây để trolling, mục đích của tôi là nếu ai đó đọc mục này để xem 'egrep' hoặc 'grep' làm gì, hãy xem các nguồn khác, mục này không thể tham chiếu đến bất cứ điều gì, nó giải thích rất ít, tệ hại, cung cấp thông tin thừa và có thể gây nhầm lẫn, đặc biệt là đối với những người không có kiến ​​thức về GNU và các công cụ mạnh mẽ mà nó cung cấp.

        Cuối cùng, bạn đã thêm và sửa lỗi mà tôi đã chỉ ra sau nhận xét đầu tiên của mình (^ $). Cũng như các trang khác, bạn nên trích dẫn người thực hiện sửa chữa, hoặc ít nhất nói rằng đó là một sửa chữa, đó là một phần của cơ sở GNU, cùng cơ sở mà blog này đã được bắt đầu và đã bị mất.

        Một lời chào.

        1.    Isaac dijo

          Cảm ơn bạn cho quan điểm của bạn.

  2.   fsaf dijo

    ffff