【问题标题】:Grep to Print all file content [duplicate]Grep打印所有文件内容[重复]
【发布时间】:2018-08-29 15:02:28
【问题描述】:

如何修改 grep 以便在其条目与 grep 模式匹配时打印完整文件,而不是仅打印匹配行? 我尝试使用(比如说)grep -C2 打印上面的两行和下面的 2 行,但这并不总是有效。行数不固定.. 我不只是搜索单个文件,而是搜索整个目录,其中一些文件可能包含给定的模式,我希望这些文件被完全打印。 我还在 grep 结果中使用了 grep,但没有打印出第一个 grep 输出。

【问题讨论】:

    标签: bash grep


    【解决方案1】:

    使用grep-l选项列出具有匹配内容的文件的路径,然后使用cat打印这些文件的内容。

    grep -lR 'regex' 'directory' | xargs -d '\n' cat 
    

    上面的命令不能处理带有换行符的文件名。 要克服 文件名带有换行符 的问题并允许更复杂的检查,您可以使用 find 命令。

    以下命令打印directory中所有常规文件的内容。

    find 'directory' -type f -exec cat {} +
    

    要仅打印内容与正则表达式regex1 regex2 匹配的文件的内容,请使用

    find 'directory' -type f \
         -exec grep -q 'regex1' {} \; -and \
         -exec grep -q 'regex2' {} \; \
         -exec cat {} +
    

    换行符只是为了更好的可读性。如果没有\,您可以将所有内容写入一行。
    请注意 -q 对应于 grep。该选项会抑制grep 的输出。 grep 的退出状态将告诉 find 是否列出文件。

    【讨论】:

    • 你能修改这个,以便我可以在第一个匹配的整个文件上使用另一个 grep,然后打印与两个 grep 匹配的整个文件
    • @AniketGupta 不是那么容易,但有一个替代方案(见编辑的答案)。
    【解决方案2】:

    简单的grep + cat 组合:

    grep 'pattern' file && cat file
    

    【讨论】:

    • 但我在目录中递归搜索
    • @AniketGupta 那你应该这么说。请编辑您的问题以使事情更清楚。
    猜你喜欢
    • 2013-08-12
    • 2017-01-28
    • 1970-01-01
    • 2011-07-17
    • 2012-02-29
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多