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

u0njafvf  于 2023-05-16  发布在  Linux
关注(0)|答案(8)|浏览(226)

我的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行呢?

vxqlmq5t

vxqlmq5t1#

|的任意输出通过管道发送到:

sed G

示例:

ls | sed G

如果你man sed你会看到

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

zaq34kh6

zaq34kh62#

管道grep输出通过

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

2mbi3lxu3#

问题在于难以区分对应于第一找到的结果的行何时结束以及对应于第二找到的结果的行何时开始。
请注意,尽管man grep说在连续的匹配组之间添加“--”。只有当在同一个文件中找到多个匹配项时才有效。但是在我的搜索中(如上所述)我正在搜索多个文件。
如果您不介意使用--代替</blank line>,请将-0参数添加到grep/zgrep命令中。这应该允许--即使在搜索多个文件时也会出现。您仍然可以根据需要使用-A-B标志。

vmpqdwk3

vmpqdwk34#

你也可以使用**--group-separator**参数,它的值为空,所以它只会添加一个新行。

some-stream | grep --group-separator=
yruzcnhs

yruzcnhs5#

我不能用-A和-B参数测试它,所以我不能肯定,但你可以尝试在Unix StackEx上使用这里提到的sed G。如果这很重要的话,你会失去颜色。

w7t8yxp5

w7t8yxp56#

grep中没有这样的选项,我不认为有一种方法可以用xargstr(我试过)来实现,但这里有一个for循环可以做到这一点(for f in *; do grep -H "1" $f && 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/path扩展字符串。

avwztpqn

avwztpqn7#

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

jw5wzhpr

jw5wzhpr8#

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

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

使用示例:

相关问题