【问题标题】:Add blank line after every result in grep在 grep 中的每个结果后添加空行
【发布时间】:2026-02-01 21:25:01
【问题描述】:

我的 grep 命令看起来像这样 zgrep -B bb -A aa "模式" *

我希望输出为:

file1:line1
file1:line2
file1:line3
file1:pattern
file1:line4
file1:line5
file1:line6
            </blank line>
file2:line1
file2:line2
file2:line3
file2:pattern
file2:line4
file2:line5
file2:line6

问题是第一个找到的结果对应的行结束和第二个找到的结果对应的行开始时很难区分。

请注意,尽管 man grep 表示在连续的匹配组之间添加了“--”。仅当在同一文件中找到多个匹配项时才有效。但在我的搜索中(如上)我正在搜索多个文件。

还要注意,在每个 bb+aa+1 行之后添加一个新的空白行是行不通的,因为如果一个文件在模式之前的行数少于 bb 行怎么办。

【问题讨论】:

  • grep -H 将有助于区分输出。
  • @WilliamPursell 那是做什么的?我试过了,但看不出有什么不同。
  • @JoshuaPinter -H 只是将文件名添加到每个输出的开头。仅当仅将单个文件作为参数传递给 grep 时,它才有所不同。不过,在这种情况下,它似乎并没有真正的帮助。
  • @WilliamPursell 感谢您的回复。以为我错过了什么。 :)
  • 在以下链接中查看使用 sed 的有效解决方案:unix.stackexchange.com/a/3128

标签: linux scripting grep


【解决方案1】:

您也可以使用 --group-separator 参数,其值为空,因此只需添加一个换行符。

some-stream | grep --group-separator=

【讨论】:

    【解决方案2】:

    | 任何输出连接到:

    sed G
    

    示例:

    ls | sed G
    

    如果你man sed 你会看到

    G 追加一个换行符,后跟保持空间的内容到模式空间。

    【讨论】:

      【解决方案3】:

      问题是第一个找到的结果对应的行结束和第二个找到的结果对应的行开始时很难区分。

      请注意,尽管 man grep 表示在连续的匹配组之间添加了“--”。仅当在同一文件中找到多个匹配项时才有效。但在我的搜索中(如上)我正在搜索多个文件。

      如果您不介意使用-- 代替&lt;/blank line&gt;,请将-0 参数添加到您的grep/zgrep 命令中。这应该允许 -- 即使在搜索多个文件时出现。您仍然可以根据需要使用-A-B 标志。

      【讨论】:

        【解决方案4】:

        试试 -c 2;通过打印上下文,我看到 grep 正在分离其找到的 o/p

        【讨论】:

          【解决方案5】:

          我无法使用 -A 和 -B 参数对其进行测试,因此我无法确定,但您可以尝试使用Unix StackEx 中提到的 sed G。如果这很重要,你会失去颜色。

          【讨论】:

            【解决方案6】:

            grep 中没有此选项,我不认为有一种方法可以使用 xargstr(我尝试过),但这里有一个for 循环会做到这一点(for f in *; do grep -H "1" $f &amp;&amp; echo; done):

            [ 11:58 jon@hozbox.com ~/test ]$ for f in *; do grep -H "1" $f && echo; done
            
            a:1
            
            b:1
            
            c:1
            
            d:1
            
            [ 11:58 jon@hozbox.com ~/test ]$ ll
            -rw-r--r--  1 jon  people     2B Nov 25 11:58 a
            -rw-r--r--  1 jon  people     2B Nov 25 11:58 b
            -rw-r--r--  1 jon  people     2B Nov 25 11:58 c
            -rw-r--r--  1 jon  people     2B Nov 25 11:58 d
            

            -H 用于显示grep 匹配的文件名。如有必要,将 * 更改为您自己的文件 glob/路径扩展字符串。

            【讨论】:

            • for 进入无限循环
            【解决方案7】:

            通过管道 grep 输出

            awk -F: '{if(f!=$1)print ""; f=$1; print $0;}'
            

            【讨论】:

            • 它有效,我赞成,谢谢!缺点是我以这种方式失去了 --color 。
            • @moejoe,我想你可以通过将 --color 转换为 --color=always 来回电。因为默认情况下,如果您输出不是终端,则当您通过管道传输到其他进程时,颜色会被抑制。
            • 您随时可以再次grep。对于您grepped 之前使用的相同字符串,以重新引入颜色语法或进一步缩小搜索范围。希望这会有所帮助。