在 grep 的每个结果后添加空行

问题描述 投票:0回答:8

我的 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 行少于怎么办。

linux scripting grep
8个回答
25
投票

通过管道
|
任何输出到:

sed G

示例:

ls | sed G

如果你
man sed
你就会看到

G
将换行符后跟保留空间的内容附加到模式空间。


22
投票

通过管道 grep 输出

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

4
投票

问题在于,很难区分第一个查找结果对应的行何时结束,以及第二个查找结果对应的行何时开始。

请注意,尽管 man grep 说“--”是在连续的匹配组之间添加的。仅当在同一文件中找到多个匹配项时它才起作用。但在我的搜索中(如上所述)我正在搜索多个文件。

如果您不介意用

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


4
投票

您还可以使用 --group-separator 参数,将其设置为空值,这样它只会添加一个换行符。

some-stream | grep --group-separator=

1
投票

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


0
投票

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

[ 11:58 [email protected] ~/test ]$ for f in *; do grep -H "1" $f && echo; done

a:1

b:1

c:1

d:1

[ 11:58 [email protected] ~/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
匹配的文件名。 如有必要,将
*
更改为您自己的文件全局/路径扩展字符串。


0
投票

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


0
投票

这里有一个解决方案,它对结果进行编号,在每个结果之间添加一个空行,修剪每个结果的前导空格,强制显示 grep 的颜色,并修剪过长的结果:

grep -Hrni "foobar" * --color=always | awk -F: '{print "\n"NR ": " $0}' | awk '{$1=$1};1' | cut -b 1-400

使用示例:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.