了解Grep选项-H在不同情况下的实际应用

Léo*_* 준영 5 grep option

这个问题是基于这个答案.

为什么从这两个命令获得相同的输出?

命令A.

$sudo grep muel *                                                             /tmp
masi:muel
Run Code Online (Sandbox Code Playgroud)

命令B.

$sudo grep -H muel *                                                          /tmp
masi:muel
Run Code Online (Sandbox Code Playgroud)

罗布的评论告诉我,命令A不应该给我masi:,而只是muel.

总之,实际目的是-H什么?

Ric*_*dle 12

如果给出多个文件名,Grep将默认列出文件名.-H即使只给出一个文件名,该选项也可以实现.在两个示例中,都给出了多个文件名.

这是一个更好的例子:

$ grep Richie notes.txt
Richie wears glasses.

$ grep -H Richie notes.txt
notes.txt:Richie wears glasses.
Run Code Online (Sandbox Code Playgroud)

当你为一个未知数量的文件提供通配符时,它会更有用,即使通配符只匹配一个文件,你总是希望打印文件名.


Bob*_*ack 5

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

$ grep muel mesi
muel

$ grep -H muel mesi
masi:muel
Run Code Online (Sandbox Code Playgroud)

这在各种脚本环境中可能很重要.例如,脚本(或非平凡的管道系列命令)可能不知道它实际处理的文件数量:一个或多个.

  • @Masi:假设你刚刚在一个200 GB的磁盘驱动器上运行'find'操作,并且花了一个半小时来进行grepping.你有一个带有结果的文件 - 但'grep'没有显示文件名,因为它是最后查看的文件,而且它是'xargs'生成的命令列表中唯一的文件.您现在知道数据存在于文件中 - 但您现在不知道哪一个; 你必须再次重做整个'find'命令(也许不是'xargs'和'grep',所以它会更快,但是......).那对我来说是令人沮丧的. (3认同)
  • 使用`xargs`是一个地方; 如果只有一个文件被发送到它,那么`grep`将不会打印文件名,除非你告诉它(GNU`grep -H`,而不是POSIX`grep`)或除非你使用'`xargs grep whatever/dev/null`'这样`grep`总是看到至少两个文件名(实际上,如果它没有给出名字,`xargs`仍然运行`grep something/dev/null`,但是没有产生输出 - 可能是什么无论如何都被通缉了).如果`xargs`处理20个批次的文件,你也可以得到这个效果,你总共有41个文件.不要看到最后一个文件名是令人恼火的! (2认同)