Linux Grep-如何将文件名连接到每个返回的文件内容行?

Linux Grep-如何将文件名连接到每个返回的文件内容行?,linux,shell,grep,Linux,Shell,Grep,我有一份声明 查找一组文件 猫把它们的东西都吐出来了 然后把它们的内容变大 这条管道: find . | grep -i "Test_" | xargs cat | grep -i "start-node name=" 生成输出,例如: <start-node name="Start" secure="false"/> <start-node name="Run" secure="false"/> 我希望得到的是: filename1-<start-node

我有一份声明

  • 查找一组文件
  • 猫把它们的东西都吐出来了
  • 然后把它们的内容变大
  • 这条管道:

    find . | grep -i "Test_" | xargs cat | grep -i "start-node name="
    
    生成输出,例如:

    <start-node name="Start" secure="false"/>
    <start-node name="Run" secure="false"/>
    
    
    
    我希望得到的是:

    filename1-<start-node name="Start" secure="false"/>
    filename2-<start-node name="Run" secure="false"/>
    
    filename1-
    文件名2-
    
    一个更容易的方法是对
    查找的结果执行grep,而不使用
    xargs
    cat

    grep -i "Test_" `find .` | grep -i "start-node name="
    

    如果您只需要数一数:

    find . | grep -i "Test_" | xargs cat | grep -i "start-node name=" | awk 'BEGIN{n=0}{n=n+1;print "filename" n "-" $0}'
    

    man grep

     -H      Always print filename headers with output lines.
    

    因为您将
    cat
    所有文件都放在一个流中,
    grep
    没有任何文件名信息。您希望将所有文件名作为参数提供给
    grep

    find ... | xargs grep "<start-node name=" /dev/null
    
    混合大小写模式表明您的文件名并不真正区分大小写,您可能不希望grep符号链接(我确信您不希望目录和特殊文件被传递),在这种情况下,您可以简化(并且可以再次使用portable
    find
    ):

    现在,为了防止文件名在管道上绊倒,您必须

    find . -name '*Test_*' -type 'f' -print0 \
       | xargs -0 grep -e "<start-node name=" -- /dev/null
    

    谢谢,这个解决方案在匹配结果之前提供了文件名,我可以使用sed来清理这些文件名。我相信这和问题一样,也存在着长期存在的问题。虽然没有严格解析ls,但效果是一样的。Try:
    mkdir tmp$$;cd tmp$$;echo hello>foo\bar;grep-i hello`find.`
    添加此标志只会产生“(标准输入)”我希望看到的文件名,这是因为您正在
    cat
    处理文件。如果您将文件名传递给grep,grep将知道文件名。这个问题专门询问文件名,因此单靠计数显然是不够的。没有输入数据,我很难弄清楚这到底是做什么的。grep的
    -l
    选项(小写l)是否不需要
    find
    ,就无法实现您想要的功能?类似于
    grep-lr“start node name=”。
    find . -name '*Test_*' -type 'f' | xargs grep ...
    
    find . -name '*Test_*' -type 'f' -print0 \
       | xargs -0 grep -e "<start-node name=" -- /dev/null
    
    grep --recursive --include '*[Tt]est_*' -e "<start-node name=" .