我的grep命令看起来像这样 zgrep -B bb -A aa“pattern”*
我希望输出为:
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,那该怎么办。
答案 0 :(得分:16)
通过
输出grep输出awk -F: '{if(f!=$1)print ""; f=$1; print $0;}'
答案 1 :(得分:6)
|
的所有输出管道到:sed G
ls | sed G
man sed
,您会看到 G
追加一个换行符,后跟保留空间的内容到模式空间。
答案 2 :(得分:1)
我无法使用-A和-B参数对其进行测试,因此我无法确定,但您可以尝试使用Unix StackEx中提到的sed G。如果这很重要,你会失去色彩。
答案 3 :(得分:1)
您还可以使用-group-separator 参数,该参数的值为空,因此只需添加换行符即可。
some-stream | grep --group-separator=
答案 4 :(得分:0)
在grep
中没有选项,我不认为有办法通过xargs
或tr
(我尝试过) ),但这是一个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扩展字符串。
答案 5 :(得分:0)
尝试使用-c 2;打印上下文后,我看到grep正在分离找到的o / p
答案 6 :(得分:0)
问题在于,很难区分与第一个找到的结果相对应的行何时结束以及与第二个找到的结果相对应的行何时开始。
请注意,尽管man grep说在连续的匹配项之间添加了“-”。仅当在同一文件中找到多个匹配项时,它才起作用。但是在搜索中(如上所述),我正在搜索多个文件。
如果您不介意用--
代替</blank line>
,请将-0
参数添加到grep
/ zgrep
命令中。即使搜索多个文件,这也应允许--
出现。您仍然可以根据需要使用-A
和-B
标志。