了解Grep'的实际使用;不同情况下的s选项-H

了解Grep'的实际使用;不同情况下的s选项-H,grep,option,Grep,Option,这个问题的基础是 为什么两个命令的输出相同? 命令A $sudo grep muel * /tmp masi:muel 命令B $sudo grep -H muel * /tmp masi:muel Rob的评论建议我,命令A不应该给我masi:,而应该只给我m

这个问题的基础是

为什么两个命令的输出相同?

命令A

$sudo grep muel *                                                             /tmp
masi:muel
命令B

$sudo grep -H muel *                                                          /tmp
masi:muel
Rob的评论建议我,命令A不应该给我
masi:
,而应该只给我
muel


简而言之,如果给定了多个文件名,那么
-H
的实际用途是什么?

默认情况下,Grep将列出文件名。
-H
选项使它即使只给出一个文件名也可以这样做。在两个示例中,都给出了多个文件名

这里有一个更好的例子:

$ grep Richie notes.txt
Richie wears glasses.

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

当您为未知数量的文件指定一个通配符,并且始终希望打印文件名(即使通配符只匹配一个文件)时,它会更有用。

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

$ grep muel mesi
muel

$ grep -H muel mesi
masi:muel

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

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

Emacs具有grep接口(M-x grep、M-x lgrep、M-x rgrep)。如果您要求Emacs在当前目录中搜索foo,那么Emacs将调用grep并处理grep输出,然后向您显示带有可单击链接的结果。点击链接,就像谷歌一样

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

一般来说,一致性有利于成为一个好的API,但一致性与DWIM冲突


当您直接使用grep时,您需要DWIM,因此您不需要通过-H。

是否要检查每个*nix命令行实用程序的每个选项?只是想知道…它不完全在“what Dos-H do”的层次上,更多的是“在什么情况下您可以使用它”。不可否认,这不是一个很好的问题标题。@Bobby Jack然而,请举一个例子,说明使用选项
-H
,有什么用处。我以前从未使用过它。如果你使用管道,grep将读取标准输入。这意味着没有文件名。。从我的头顶上掉下来。我可以想象这样一个脚本,它“走”过一堆目录,从每个目录中收集一个给定术语出现的文件名,并将“grep”的结果传递给cut-H将保证文件名,即使最初只搜索了一个文件。这不是一个很好的例子,但这是一个具体的例子,因为我可以在短时间内通知!)使用
xargs
是一个地方;如果只有一个文件发送到它,那么
grep
将不会打印文件名,除非您告诉它(GNU
grep-H
,但不是POSIX
grep
),或者除非您使用“
xargs grep whatever/dev/null
”,这样
grep
总是至少可以看到两个文件名(事实上,如果没有给它命名,
xargs
仍然运行
grep something/dev/null
,但这不会产生任何输出—可能是需要的)。如果
xargs
以20个文件为一批处理文件,而您总共有41个文件,那么您也可以获得这种效果。看不到最后一个文件名真让人恼火!@Masi:假设您刚刚在一个200 GB的磁盘驱动器上运行了一个“查找”操作,并花了一个半小时进行了格雷普操作。您得到了一个有结果的文件,但“格雷普”没有显示出来您可以更改文件名,因为它是查看的最后一个文件,并且是“xargs”生成的命令列表中唯一的文件。您现在知道数据存在于文件中,但现在不知道是哪个文件;您必须重新执行整个“find”命令(可能不是“xargs”和“grep”,因此速度会更快,但是…).那会让我很沮丧。@Richie:Bobby的回答很好。我以前不知道这个选项的实际含义。