Từ man greptrang (trên Debian):
SỰ MIÊU TẢ
grep searches the named input FILEs (or standard input if no files are
named, or if a single hyphen-minus (-) is given as file name) for lines
containing a match to the given PATTERN. By default, grep prints the
matching lines.
Trong trường hợp đầu tiên, grepmở tệp; trong lần thứ hai, shell sẽ mở tệp và gán nó vào đầu vào tiêu chuẩn của grepvà grepkhông được thông qua bất kỳ đối số tên tệp nào giả định rằng nó cần grep đầu vào tiêu chuẩn của nó.
Ưu điểm của 1:
grep có thể grep nhiều hơn một tập tin¹.
grepcó thể hiển thị tên tệp nơi mỗi lần xuất hiện lineđược tìm thấy.
Ưu điểm của 2:
- Nếu tệp không thể được mở, trình bao trả về lỗi sẽ bao gồm nhiều thông tin liên quan hơn (như số dòng trong tập lệnh) và theo cách phù hợp hơn (nếu bạn cũng để trình bao mở tệp cho các lệnh khác) so với khi
grepmở nó ra Và nếu tệp không thể được mở, grepthậm chí không được gọi (đối với một số lệnh - có thể không grep- có thể tạo ra sự khác biệt lớn).
- trong
grep line < in > out, nếu inkhông thể mở, outsẽ không được tạo hoặc cắt bớt.
- Không có vấn đề gì với một số tệp có tên khác thường (tên
-hoặc tên tệp bắt đầu bằng -) ².
- mỹ phẩm: bạn có thể đặt
<filebất cứ nơi nào trên dòng lệnh để hiển thị dòng lệnh một cách tự nhiên hơn, như <in grep line >outnếu bạn thích.
mỹ phẩm: với GNU grep, bạn có thể chọn nhãn nào sẽ sử dụng trước dòng phù hợp thay vì chỉ tên tệp như trong:
<file grep --label='Found in file at line' -Hn line
Về mặt hiệu suất, nếu tệp không thể được mở, bạn lưu thực thi grepkhi sử dụng chuyển hướng, nhưng nếu không thì greptôi không mong đợi nhiều sự khác biệt.
Với tính năng chuyển hướng, bạn tiết kiệm được việc phải truyền thêm một đối số grep, bạn sẽ grepphân tích cú pháp đối số dễ dàng hơn một chút. Mặt khác, shell sẽ cần (ít nhất) một cuộc gọi hệ thống bổ sung đến dup2()bộ mô tả tệp vào bộ mô tả tệp 0.
Trong { grep -m1 line; next command; } < file, grep(ở đây GNU grep) sẽ muốn seek()quay lại ngay sau dòng phù hợp để next commandphần còn lại của tệp (nó cũng sẽ cần xác định xem tệp có thể tìm kiếm được hay không). Nói cách khác, vị trí trong stdin là một trong những grepđầu ra khác. Với grep -m1 line file, nó có thể tối ưu hóa điều đó, đó là một điều ít grepquan tâm hơn.
Ghi chú
Với zsh, bạn có thể làm:
grep line < file1 < file2
nhưng điều đó tương đương với cat file1 file2 | grep line(không gọi cattiện ích) và do đó kém hiệu quả hơn, có thể gây nhầm lẫn nếu tệp đầu tiên không kết thúc bằng ký tự dòng mới và sẽ không cho bạn biết mẫu nào được tìm thấy.
² Trong trường hợp ksh93và bashmặc dù, có các tệp như /dev/tcp/host/port(và /dev/fd/xtrên một số hệ thống bash), khi được sử dụng trong mục tiêu chuyển hướng, shell chặn cho các mục đích đặc biệt thay vì thực sự mở tệp trên hệ thống tệp (mặc dù nói chung, các tệp đó không tồn tại trên hệ thống tập tin). /dev/stdinphục vụ cùng một mục đích như -được công nhận bởi grep, nhưng ít nhất, ở đây nó được đặt tên đúng hơn (bất kỳ ai cũng có thể tạo một tệp được gọi -trong bất kỳ thư mục nào, trong khi chỉ quản trị viên mới có thể tạo tệp được gọi /dev/tcp/host/portvà quản trị viên nên biết rõ hơn).