猫 * | grep 东西...结果是什么文件?

Jak*_*son 8 bash grep cat

如果要运行以下命令

cat * | grep DATABASE
Run Code Online (Sandbox Code Playgroud)

shell 会吐出 * 文件中包含单词的所有行DATABASE。有什么办法也可以吐出每行分开的文件吗?

我试着使用-H了grep的选项根据该man说,print the filename for each match但在我的壳它只是说,

(standard input):$DATABASE_FUNCTION = dothis();
Run Code Online (Sandbox Code Playgroud)

Edu*_*nec 22

不要为此使用 cat 。而是直接使用grep DATABASE *or grep -n DATABASE *(如果您想知道行号以及文件名)。

看到cat 的无用使用

澄清一点:cat *实际上将所有文件连接起来,因为它通过管道将它们提供给 grep,因此 grep 无法知道哪些内容属于哪个文件,甚至实际上甚至无法真正知道它是在扫描文件还是您正在扫描只是打字非常快。一旦你使用管道,它就是一个很大的标准输入流。

最后,-H几乎可以肯定是多余的,因为 grep 在搜索多个文件时默认打印文件名。不过,如果您想解析输出,它可能会有用,因为*glob有可能扩展为单个文件,而 grep 在这种情况下会省略文件名。


Gor*_*son 6

使用grep -H DATABASE *(注意:如果目录中有多个文件,则-H是可选的)。

您遇到的问题是,使用您的命令,cat *将所有文件连接在一起成为一个大混乱,然后|将其发送到grep DATABASE. 当 grep 看到数据时,关于它来自哪里的信息已经丢失。解决方案是让 grep 完成查看单个文件的工作,因此当它找到匹配项时,它知道它来自哪个文件。