5

这个问题是基于这个答案

为什么你从两个命令中得到相同的输出?

命令 A

$sudo grep muel *                                                             /tmp
masi:muel

命令 B

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

Rob 的评论告诉我,命令 A不应该给我masi:,而应该给我muel

简而言之,它的实际目的是-H什么?

4

4 回答 4

13

如果给出多个文件名,Grep 将默认列出文件名。-H即使只给出了一个文件名,该选项也可以做到这一点。在您的两个示例中,都给出了多个文件名。

这是一个更好的例子:

$ grep Richie notes.txt
Richie wears glasses.

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

当您为未知数量的文件提供通配符时,它会更有用,并且即使通配符仅匹配一个文件,您也总是希望打印文件名。

于 2009-07-13T21:37:41.933 回答
5

如果您 grep 单个文件, -H 会有所不同:

$ grep muel mesi
muel

$ grep -H muel mesi
masi:muel

这在各种脚本上下文中可能很重要。例如,一个脚本(或一系列重要的管道命令)可能不知道它实际处理了多少文件:一个或多个。

于 2009-07-13T21:38:31.493 回答
1

当您从多个文件中 grep 时,默认情况下它会显示找到匹配项的文件的名称。如果您指定 -H,则始终显示文件名,即使您从单个文件中 grep 也是如此。您可以指定 -h 以从不显示文件名。

于 2009-07-13T21:39:03.663 回答
1

Emacs 有 grep 接口(Mx grep、Mx lgrep、Mx rgrep)。如果您让 Emacs 在当前目录中搜索 foo,那么 Emacs 会调用 grep 并处理 grep 输出,然后通过可点击的链接向您显示结果。可点击的链接,就像谷歌一样。

Emacs 所做的是将两个选项传递给 grep:-n(显示行号)和 -H(即使只有一个文件也显示文件名。重点是一致性),然后将输出转换为可点击的链接。

一般来说,一致性是好的 API,但一致性与 DWIM 冲突。

直接用grep的时候要DWIM,所以不用-H。

于 2009-12-14T17:41:40.007 回答