2013-08-05 48 views
41

Tôi có câu hỏi về grepegrep trong unix.Sự khác biệt giữa egrep và grep

Vì gần đây tôi đang nghiên cứu shell commands trong unix, tôi muốn biết sự khác biệt giữa grep và egrep là gì.

Tôi thấy chúng tôi có thể sử dụng grep và egrep với cụm từ thông dụng. Tuy nhiên, tôi đã tìm thấy điều gì đó khác biệt giữa hai lệnh sau:

Đối với ^, grep và egrep có cùng ý nghĩa là tìm các dòng chứa các nội dung nhất định ngay từ đầu.

Tuy nhiên, đối |, grep, mà không slash lại trước |, có nghĩa là nhân vật của |, và nếu tôi đặt một dấu gạch chéo lại trước mặt nó, nó quay vào nó ý nghĩa đặc biệt của việc tìm kiếm các dòng chứa một trong hai thứ ở phía trước và đằng sau nó. NHƯNG, cho egrep, nó là ngược lại. | có ý nghĩa sau của grep và \| có nghĩa cũ của grep khi sử dụng nó.

Ai đó có thể giải thích lý do tại sao?

Trả lời

64

Có, tôi có thể.

Lệnh egrep là phím tắt cho grep nhị phân, nhưng với một ngoại lệ, khi grep được gọi như egrep các grep nhị phân kích hoạt logic nội bộ của nó như là nó sẽ được gọi là grep -E.

gì sự khác biệt bạn sẽ hỏi .. và sự khác biệt là -E tham số cho phép sử dụng các mẫu regexp mở rộng, nó sẽ cho phép bạn sử dụng các ví dụ meta-biểu tượng như +, ? hoặc | (ống). Chúng không phải là các ký tự thứ tự như chúng ta từng có trong các từ hoặc tên tập tin mà chỉ kiểm soát các lệnh cho chính số nhị phân grep. Do đó, | có nghĩa là hợp lý HOẶC.

Vì vậy, ví dụ: bạn muốn liệt kê các tệp trong thư mục và chỉ xem những tệp có chứa các giới hạn "mp4" hoặc "avi". Với egrep bạn sẽ làm gì:

ls | egrep "mp4|avi"

Trong ví dụ này | hành vi như OR lệnh nó sẽ lấy đầu ra từ ls tất cả các tên có chứa một trong hai "mp4" hoặc "avi" chuỗi. Nếu bạn chạy nó với lệnh trơn tru grep, bạn sẽ không nhận được gì, bởi vì grep không biết điều đó như lệnh | và nó sẽ tìm kiếm chuỗi văn bản "mp4 | avi" (với biểu tượng ống). Ví dụ. nếu bạn có |MPG|cool-guy.q2.stats tập tin trong thư mục của bạn, bạn sẽ nhận được nó với đồng bằng grep tìm kiếm với đường ống.

Sooo, đó là lý do tại sao bạn nên thoát | trong lệnh egrep để đạt được hiệu quả tương tự như trong grep. Thoát sẽ hiển thị ý nghĩa đặc biệt của lệnh | cho grep nhị phân.

+2

Xin chào, cảm ơn bạn rất nhiều. Nó rất rõ ràng. Tôi thực sự, thực sự đánh giá cao nó. –

+8

Giải thích hay. Chỉ có điều tôi sẽ thêm là các biểu thức chính quy cơ bản * làm * nhận dạng các ký hiệu meta như '+', '?', '|', V.v., nhưng bạn phải thoát chúng (tiền tố '\') để bật chúng lên (trong khi với biểu thức chính quy mở rộng, bạn phải thoát khỏi chúng để tắt chúng đi.) Vì vậy, "grep -E 'a | b'" giống như "grep" a \ | b '"(khớp với a hoặc b) và" grep -E 'a \ | b' "giống như" grep 'a | b' "(chỉ khớp với chuỗi 'a | b') –

+0

Trong' egrep', '?', '+' '{' ' | '' ('') 'là các ký hiệu biểu thức chính quy. – Hunger

0

lệnh grep được sử dụng để tìm các dòng có cần PATRAN trong một tập tin, chúng tôi có riêng meta-nhân vật bằng cách đặt '\'

egrep bằng grep -E, mà được mở rộng sử dụng biểu thức chính quy {, }, (,), | ,? như meta-nhân vật mà không đưa '\' trong biểu

fgrep được sử dụng để tìm ra chuỗi cố định, tương đương với grep -F

test.txt
tập tin
ngói
(f | t) ile
(\ f \ | \ t) ile

grep "(f | t) ile" test.txt
(f | t) ile

grep "(\ f \ | \ t)tôi le" test.txt
tập tin
ngói

egrep "(f | t) ile" test.txt
tập tin
ngói

egrep "(\ f \ | \ t) ile" thử nghiệm .txt
(f | t) ile

fgrep "(f | t) ile" test.txt
(f | t) ile

fgrep "(\ f \ | \ t) ile "test.txt
(\ f \ | \ t) ile

Các vấn đề liên quan