如果要运行以下命令
cat * | grep DATABASE
shell 会输出 * 文件中所有包含该单词的行DATABASE
。有没有办法输出每行属于哪个文件?
我尝试使用-H
grep 选项,但在我的 shell 中它只是man
说print the filename for each match
(standard input):$DATABASE_FUNCTION = dothis();
答案1
不要使用 cat 来做这件事。而应直接使用grep DATABASE *
or grep -n DATABASE *
(如果您想知道行号以及文件名)。
看猫的无用用途。
再澄清一点:cat *
实际上,在通过管道将所有文件提供给 grep 时,它会将所有文件连接起来,因此 grep 无法知道哪些内容属于哪个文件,甚至无法真正知道它是在扫描文件还是您只是在快速输入。一旦使用管道,它们就都是一个大的标准输入流。
最后,-H
这几乎肯定是多余的,因为当 grep 需要搜索多个文件时,它会默认打印文件名。不过,如果你想解析输出,它可能会派上用场,因为 glob 可能*
会扩展为单个文件,在这种情况下 grep 会省略文件名。
答案2
使用grep -H DATABASE *
(注意:如果目录中有多个文件,则为-H
可选)。
您遇到的问题是,使用命令,cat *
将所有文件连接在一起形成一个大混乱,然后|
将其发送到 标准输入grep DATABASE
。当 grep 看到数据时,有关数据来源的信息已经丢失。解决方案是让 grep 执行查看单个文件的工作,这样当它找到匹配项时,它就知道它来自哪个文件。