猫* | grep某事…结果在什么文件中?


8

如果要运行以下命令

cat * | grep DATABASE

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

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

(standard input):$DATABASE_FUNCTION = dothis();

好问题。我仍在努力折断猫-> grep养成自己的习惯。:)
Sirex

Answers:


22

不要用猫做那件事。而是直接使用grep DATABASE *grep -n DATABASE *(如果您想知道行号以及文件名)。

猫无用

进一步说明一下:cat *实际上是在将所有文件通过管道馈送到grep时将它们串联起来,因此grep无法知道哪个内容属于哪个文件,甚至甚至无法真正知道它是在扫描文件还是您在只需快速输入即可。使用管道后,所有这些都是一大标准输入流。

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


6

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

您遇到的问题是使用命令cat *将所有文件连接在一起,变成一团糟,然后|将其发送到的标准输入中grep DATABASE。到grep看到数据时,有关其来源的信息已丢失。解决方案是让grep完成各个文件的查找工作,因此当找到匹配项时,它便知道该文件来自哪个文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.