2009-07-13 15 views
5

Câu hỏi này được dựa trên this answer.Để hiểu việc sử dụng thực tế tùy chọn của Grep -H trong các tình huống khác nhau

Tại sao bạn nhận được cùng một đầu ra từ cả hai lệnh?

lệnh Một

$sudo grep muel *                /tmp 
masi:muel 

lệnh B

$sudo grep -H muel *               /tmp 
masi:muel 

bình luận của Rob gợi ý với tôi rằng lệnh Một không nên cho tôi masi:, nhưng chỉ muel.

Tóm lại, mục đích thực tế của -H là gì?

+1

Bạn sẽ đi qua từng tùy chọn của mọi tiện ích dòng lệnh * nix? Chỉ cần tự hỏi ... –

+2

Nó không phải QUITE ở cấp độ "những gì hiện -H làm", nhiều hơn "trong tình huống nào bạn có thể sử dụng nó". Không phải là một câu hỏi tuyệt vời, phải thừa nhận. –

+1

@Bobby Jack Tuy nhiên, hãy xem http://stackoverflow.com/users/54964?tab = recent # sort-top –

Trả lời

12

Grep sẽ liệt kê tên tệp theo mặc định nếu có nhiều hơn một tên tệp. Các tùy chọn -H làm cho nó làm điều đó ngay cả khi chỉ có một tên tập tin được đưa ra. Trong cả hai ví dụ của bạn, nhiều hơn một tên tập tin được đưa ra.

Dưới đây là một ví dụ tốt hơn:

$ grep Richie notes.txt 
Richie wears glasses. 

$ grep -H Richie notes.txt 
notes.txt:Richie wears glasses. 

Đó là hữu ích hơn khi bạn đang đem lại cho nó một ký tự đại diện cho một số tệp không xác định, và bạn luôn muốn tên file in ngay cả khi wildcard chỉ phù hợp với một tập tin.

+0

@Richie: Câu trả lời của Bobby rất tuyệt vời. Tôi không biết trước về những tác động thực tế của lựa chọn. –

5

Nếu bạn grep một tập tin duy nhất, -H làm cho một sự khác biệt:

$ grep muel mesi 
muel 

$ grep -H muel mesi 
masi:muel 

Đây có thể là đáng kể trong bối cảnh kịch bản khác nhau. Ví dụ: một tập lệnh (hoặc một chuỗi lệnh không nhỏ) có thể không biết số lượng tệp thực sự xử lý: một hoặc nhiều tệp.

+0

Bạn có thể đưa ra ví dụ hữu ích khi sử dụng tùy chọn '-H' không. Tôi chưa bao giờ cần nó trước đây. –

+1

Nếu bạn đường ống, grep sẽ đọc từ đầu vào tiêu chuẩn. Điều đó có nghĩa là không có tên tập tin. – Zr40

+1

Hmm .. khó khăn trên đầu của tôi. Tôi có thể tưởng tượng một kịch bản mà 'đi' qua một loạt các thư mục, thu thập tên tập tin từ mỗi một thuật ngữ nhất định xuất hiện trong, đi qua kết quả của 'grep' để cắt. -H sẽ đảm bảo tên tập tin, ngay cả khi chỉ có một tập tin duy nhất được tìm kiếm ở nơi đầu tiên. Đó không phải là một ví dụ tuyệt vời, nhưng nó là một cụ thể như tôi có thể được thông báo ngắn! :) –

1

Khi bạn grep từ nhiều tệp, theo mặc định, nó hiển thị tên của tệp nơi tìm thấy kết quả phù hợp. Nếu bạn chỉ định-H, tên tệp sẽ luôn được hiển thị, ngay cả khi bạn grep từ một tệp. Bạn có thể chỉ định -h để không bao giờ hiển thị tên tệp.

1

Emacs có giao diện grep (M-x grep, M-x lgrep, M-x rgrep). Nếu bạn yêu cầu Emacs tìm kiếm foo trong thư mục hiện tại, thì Emacs gọi grep và xử lý đầu ra grep và sau đó hiển thị kết quả với các liên kết có thể nhấp. Các liên kết có thể nhấp, giống như Google.

Điều Emacs thực hiện là nó chuyển hai tùy chọn tới grep: -n (hiển thị số dòng) và -H (hiển thị tên tệp ngay cả khi chỉ có một tệp. Điểm là nhất quán) và sau đó chuyển đầu ra thành liên kết có thể nhấp.

Nói chung, tính nhất quán là tốt để trở thành một API tốt, nhưng sự nhất quán xung đột với DWIM.

Khi bạn trực tiếp sử dụng grep, bạn muốn DWIM, vì vậy bạn không vượt qua -H.

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