20 ví dụ lệnh egrep trên Centos / Ubuntu / Debian / Fedora
Lệnh egrep trong Linux được nhận biết bởi họ lệnh grep, được sử dụng để tìm kiếm và khớp một mẫu cụ thể trong các tệp tin. Nó hoạt động tương tự như grep -E (grep với regex mở rộng), nhưng thường tìm kiếm trong một tệp tin cụ thể hoặc từng dòng và in ra các dòng trong tệp tin đã cho.
Cú pháp của lệnh egrep như sau:
$ egrep [OPTIONS] PATTERNS [FILES]
Hãy tạo một tệp tin văn bản mẫu với nội dung sau để sử dụng làm ví dụ:
$ cat sample.txt
Ở đây, chúng ta có thể thấy tệp tin văn bản đã sẵn sàng. Bây giờ sẽ thảo luận về một số ví dụ thông thường có thể sử dụng hàng ngày.
Cách tìm kiếm một mẫu trong một tệp tin đơn bằng lệnh egrep
Hãy bắt đầu với một ví dụ đơn giản về khớp mẫu, trong đó chúng ta có thể sử dụng lệnh sau để tìm kiếm chuỗi "professional" trong tệp tin "sample.txt":
$ egrep professionals sample.txt
Cách tô màu các mẫu khớp trong tệp tin
Chúng ta có thể làm cho đầu ra trở nên hữu ích hơn bằng cách tô màu các mẫu khớp. Để làm được điều này, bạn sử dụng tùy chọn --color của lệnh egrep. Ví dụ, lệnh sau sẽ tô màu đỏ cho từ "professionals":
$ egrep --color=auto professionals sample.txt
Ở đây, chúng ta có thể thấy đầu ra tương tự nhưng cung cấp thông tin nhiều hơn so với trước đó. Bạn cũng có thể dễ dàng nhận biết rằng từ "professionals" lặp lại hai lần.
Trên hầu hết các hệ thống Linux, thiết lập trên được bật theo mặc định bằng việc sử dụng các "alias" sau:
$ alias egrep='egrep –color=auto'
Cách tìm kiếm một mẫu trong nhiều tệp tin
Lệnh egrep cho phép chấp nhận nhiều tệp tin làm đối số, cho phép chúng ta tìm kiếm một mẫu cụ thể trong nhiều tệp tin. Hãy hiểu điều này thông qua một ví dụ.
Đầu tiên, tạo một bản sao của tệp tin "sample.txt":
$ cp sample.txt sample-copy.txt
Tiếp theo, tìm kiếm mẫu "professionals" trong cả hai tệp tin:
$ egrep professionals sample.txt sample-copy.txt
Trong ví dụ trên, chúng ta có thể thấy tên tệp tin trong đầu ra, đại diện cho dòng khớp từ tệp tin đó.
Cách đếm các dòng khớp trong tệp tin
Đôi khi chúng ta chỉ cần xác định xem mẫu có xuất hiện trong tệp tin hay không. Nếu có, thì xuất hiện trong bao nhiêu dòng? Trong các trường hợp như vậy, chúng ta có thể sử dụng tùy chọn -c của lệnh.
Ví dụ, lệnh sau sẽ hiển thị 1 là kết quả vì từ "professionals" chỉ xuất hiện trong một dòng.
$ egrep -c professionals sample.txt 1
Cách in chỉ các dòng khớp trong tệp tin
Trong ví dụ trước đó, chúng ta đã thấy tùy chọn -c không đếm số lần xuất hiện của mẫu. Ví dụ, từ "professionals" xuất hiện hai lần trên cùng một dòng nhưng tùy chọn -c xem như một khớp duy nhất.
Trong các trường hợp như vậy, chúng ta có thể sử dụng tùy chọn -o của lệnh để chỉ in các mẫu khớp. Ví dụ, lệnh sau sẽ chỉ hiển thị từ "professionals" trên hai dòng riêng biệt:
$ egrep -o professionals sample.txt
Bây giờ, hãy đếm số dòng bằng lệnh wc:
$ egrep -o professionals sample.txt | wc -l
Trong ví dụ trên, chúng ta đã kết hợp lệnh egrep và wc để đếm số lần xuất hiện của mẫu cụ thể.
Cách tìm kiếm một mẫu mà bỏ qua việc phân biệt chữ hoa/thường
Theo mặc định, egrep thực hiện khớp mẫu theo cách phân biệt chữ hoa/chữ thường. Điều này có nghĩa là các từ - we, We, wE và WE được xem như các từ khác nhau. Tuy nhiên, chúng ta có thể yêu cầu tìm kiếm không phân biệt chữ hoa/thường bằng cách sử dụng tùy chọn -i.
Ví dụ, trong lệnh dưới đây, mẫu khớp sẽ thành công cho các từ "we" và "We":
$ egrep -i we sample.txt
Cách loại trừ các mẫu khớp một phần
Trong ví dụ trước đó, chúng ta đã thấy rằng lệnh egrep thực hiện khớp một phần. Ví dụ, khi chúng ta tìm kiếm từ "we" thì mẫu khớp cũng thành công cho các từ khác như "web", "website" và "were".
Để khắc phục giới hạn này, chúng ta có thể sử dụng tùy chọn -w, nó sẽ yêu cầu khớp toàn bộ từ.
$ egrep -w we sample.txt
Cách đảo ngược khớp mẫu trong tệp tin
Cho đến nay, chúng ta đã sử dụng lệnh egrep để in ra các dòng mà mẫu đã cho khớp. Tuy nhiên, đôi khi chúng ta muốn thực hiện thao tác theo cách ngược lại. Ví dụ, chúng ta có thể muốn in ra các dòng mà mẫu đã cho không khớp. Chúng ta có thể làm điều này thông qua tùy chọn -v:
$ egrep -v we sample.txt
Ở đây, chúng ta có thể thấy rằng lệnh in ra tất cả các dòng không chứa từ "we".
Cách tìm số dòng của mẫu
Chúng ta có thể sử dụng tùy chọn -n của lệnh để bật hiển thị số dòng, cho biết số dòng trong đầu ra khi khớp mẫu thành công. Mẹo đơn giản này làm cho kết quả trở nên có ý nghĩa hơn. Trong đầu ra trên, chúng ta có thể thấy từ "professionals" xuất hiện trong dòng thứ 5.
$ egrep -n professionals sample.txt
Cách thực hiện khớp mẫu ở chế độ Quiet
Ở chế độ quiet, lệnh egrep sẽ không in ra mẫu khớp. Do đó, chúng ta phải sử dụng giá trị trả về của lệnh để xác định xem khớp mẫu đã thành công hay không.
Chúng ta có thể sử dụng tùy chọn -q để bật chế độ quiet, điều này rất hữu ích khi viết các script shell.
$ egrep -q professionals sample.txt $ egrep -q non-existing-pattern sample.txt
Trong ví dụ này, giá trị trả về bằng 0 chỉ ra sự hiện diện của mẫu, trong khi giá trị không bằng không chỉ ra sự vắng mặt của mẫu.
Cách hiển thị các dòng trước khớp mẫu
Đôi khi, việc hiển thị một số dòng xung quanh mẫu khớp có ý nghĩa. Đối với các tình huống như vậy, chúng ta có thể sử dụng tùy chọn -B của lệnh, nó sẽ hiển thị N dòng trước mẫu khớp.
Ví dụ, lệnh dưới đây sẽ in ra dòng mà mẫu khớp thành công cùng với 2 dòng trước đó. Trong ví dụ này, bạn sử dụng tùy chọn -n để hiển thị số dòng.
$ egrep -B 2 -n professionals sample.txt
Cách hiển thị các dòng sau khớp mẫu
Tương tự như vậy, chúng ta có thể sử dụng tùy chọn -A của lệnh để hiển thị các dòng sau mẫu khớp. Ví dụ, lệnh dưới đây sẽ in ra dòng mà mẫu khớp thành công cùng với 2 dòng tiếp theo.
$ egrep -A 2 -n professionals sample.txt
Cách hiển thị các dòng xung quanh khớp mẫu
Ngoài ra, lệnh egrep hỗ trợ tùy chọn -C, kết hợp chức năng của các tùy chọn -A và -B, cho phép hiển thị các dòng trước và sau mẫu khớp.
$ egrep -C 2 -n professionals sample.txt
Cách tìm một mẫu trong nhiều tệp tin đệ quy
Như đã thảo luận trước đó, chúng ta có thể thực hiện khớp mẫu trên nhiều tệp tin. Tuy nhiên, tình huống trở nên phức tạp khi các tệp tin nằm dưới nhiều thư mục con và truyền tất cả chúng như là đối số lệnh.
Trong các trường hợp như vậy, chúng ta có thể thực hiện khớp mẫu theo cách đệ quy bằng cách sử dụng tùy chọn -r như trong ví dụ sau.
Đầu tiên, tạo 2 thư mục con và sao chép tệp tin sample.txt vào.
$ mkdir -p dir1/dir2 $ cp sample.txt dir1/ $ cp sample.txt dir1/dir2/
Sau đó, thực hiện thao tác tìm kiếm theo cách đệ quy.
$ egrep -r professionals dir1
Cách khớp một ký tự đơn bằng biểu thức chính quy
Chúng ta có thể sử dụng dấu chấm (.) để khớp với bất kỳ ký tự đơn nào trừ ký tự cuối dòng. Ví dụ, biểu thức chính quy dưới đây khớp với văn bản har, hat và has:
$ egrep "ha." sample.txt
Cách khớp không hoặc nhiều lần của ký tự
Chúng ta có thể sử dụng ký hiệu (*) để khớp không hoặc nhiều lần xuất hiện của ký tự trước đó. Ví dụ, biểu thức chính quy dưới đây khớp với văn bản chứa chuỗi we, theo sau bởi không hoặc nhiều lần xuất hiện của ký tự b:
$ egrep "web*" sample.txt
Cách khớp một hoặc nhiều lần xuất hiện của ký tự trước đó
Chúng ta có thể sử dụng ký hiệu (+) để khớp với một hoặc nhiều lần xuất hiện của ký tự trước đó. Ví dụ, biểu thức chính quy dưới đây khớp với văn bản chứa chuỗi we, theo sau bởi ít nhất một lần xuất hiện của ký tự b.
$ egrep "web+" sample.txt
Ở đây, bạn có thể thấy rằng khớp mẫu không thành công với các từ we và were, do không có ký tự b xuất hiện.
Cách khớp đầu dòng
Chúng ta có thể sử dụng ký hiệu caret (^) để biểu diễn đầu dòng. Ví dụ, biểu thức chính quy dưới đây in ra các dòng bắt đầu bằng văn bản We:
$ egrep "^We" sample.txt
Cách khớp cuối dòng
Chúng ta có thể sử dụng ký hiệu dollar ($) để biểu diễn cuối dòng. Ví dụ, biểu thức chính quy dưới đây in ra các dòng kết thúc bằng văn bản e.:
$ egrep "e.$" sample.txt
Cách xóa các dòng trống trong tệp tin
Chúng ta có thể sử dụng caret (^) ngay sau đó là dollar ($) để biểu diễn dòng trống. Hãy sử dụng điều này trong biểu thức chính quy để xóa các dòng trống:
$ egrep -n -v "^$" sample.txt
Trong đầu ra trên, chúng ta có thể thấy rằng các số dòng 2, 4, 6, 8 và 10 không được hiển thị vì chúng là dòng trống.