我的 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 行少于怎么办。
|
任何输出到:sed G
ls | sed G
man sed
你就会看到G
将换行符后跟保留空间的内容附加到模式空间。
通过管道 grep 输出
awk -F: '{if(f!=$1)print ""; f=$1; print $0;}'
问题在于,很难区分第一个查找结果对应的行何时结束,以及第二个查找结果对应的行何时开始。
请注意,尽管 man grep 说“--”是在连续的匹配组之间添加的。仅当在同一文件中找到多个匹配项时它才起作用。但在我的搜索中(如上所述)我正在搜索多个文件。
如果您不介意用
--
代替 </blank line>
,请将 -0
参数添加到 grep
/zgrep
命令中。即使在搜索多个文件时,这也应该允许 --
出现。您仍然可以根据需要使用 -A
和 -B
标志。
您还可以使用 --group-separator 参数,将其设置为空值,这样它只会添加一个换行符。
some-stream | grep --group-separator=
我无法使用 -A 和 -B 参数对其进行测试,因此我不能确定,但您可以尝试使用 sed G,如 Unix StackEx 上所述。如果这很重要的话,你会失去颜色。
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
匹配的文件名。 如有必要,将 *
更改为您自己的文件全局/路径扩展字符串。
尝试使用-c 2;通过打印上下文,我看到 grep 正在分离它找到的 o/p