Linux grep命令在每次匹配后添加结束行

Linux grep命令在每次匹配后添加结束行,linux,shell,unix,grep,Linux,Shell,Unix,Grep,你知道如何添加一些端点吗 "==========================================================================================" 每场比赛后 tail -f error.log -n 2000 | grep -B 10 -A 25 'Exception:' 此命令打印所有异常日志,但我希望看到每个异常日志都有一行分隔符。您需要以下选项: --组分隔符=SEP 使用SEP作为组分隔符。默认情况下,SEP是双连字符

你知道如何添加一些端点吗

"=========================================================================================="
每场比赛后

tail -f error.log -n 2000 | grep -B 10 -A 25 'Exception:'

此命令打印所有异常日志,但我希望看到每个异常日志都有一行分隔符。

您需要以下选项:

--组分隔符=SEP
使用SEP作为组分隔符。默认情况下,SEP是双连字符(-)

演示:

$ cat file
before
exception 1
after
foo
bar
before
exception 2
after

$ grep -A 1 -B 1 --group-separator======================== exception file 
before
exception 1
after
=======================
before
exception 2
after

对于像我这样的人来说,他们有一个“非常旧”的grep,它不包括
--group separator
选项,下面的方法似乎是可以接受的

请注意,
grep
(我的版本,2.5.1)确实在组之间产生了一个“小的、默认的”分隔符(
--
),您可以轻松地将该字符串替换为您选择的字符串:

tail -f rms.log -n 2000 | grep -B 10 -A 25 'Exception:' | sed 's/^--$/=================/'
这会将
--
替换为
================

很明显,你可以根据自己的喜好修改它。如果您可以选择使用
--组分隔符
(@sudo_O的答案),这显然更可取


编辑阅读问题下方的评论,我意识到当@starrify更新了他的评论(我以前没有注意到)时,他的评论基本上直接指向了这个解决方案——因此我觉得我对他有一个建议…

我更喜欢
sed
进行文本处理:

# cat test 
1
Exception
2
Exception
3
4
Exception
5
Exception
6
7
8
Exception
9



# sed -i '/Exception/a =========================' test 


# cat test 
1
Exception
=========================
2
Exception
=========================
3
4
Exception
=========================
5
Exception
=========================
6
7
8
Exception
=========================
9

你发布了一个命令,它没有做你想做的事情,并且描述了它的输出,但是你没有告诉我们你想做什么,所以这只是一个猜测,但也许它会有用。它打印某些regexp之前的2行和之后的3行:

$ cat file
a
b
c
d
FOO
e
f
g
h
i
j
FOO
k
l
m
n
o

$ awk -v re="FOO" -v b=2 -v a=3 'NR==FNR{line[FNR]=$0;next} $0 ~ re{for (i=(FNR-b);i<=(FNR+a);i++) print line[i]; print "=====" }' file file
c
d
FOO
e
f
g
=====
i
j
FOO
k
l
m
=====
$cat文件
A.
B
C
D
福
E
F
G
H
我
J
福
K
L
M
N
o

$awk-v re=“FOO”-v b=2-v a=3'NR==FNR{line[FNR]=$0;next}$0~re{for(i=(FNR-b);iHasn
grep
已经在匹配项之间放置了一个类似于
-
的分隔符,因为您正在指定
-a
-b
而不指定
-o
?@starrify这是我的第一个想法,但
grep
命令生成26行(前10行,后25行)-然后OP希望添加一行。我不确定如何识别“块”(可能是awk,每36行添加一个分隔符)@Floris谢谢你指出这一点。我也有同样的想法,我编辑了我的评论…每36行添加一个分隔符是可以的,但仍然需要处理第一个和最后一个没有足够行的匹配。@starrify-我很晚才意识到你更新的评论直接指向了我发布的解决方案。大声喊吧!我每天都在学习新的东西。早上第一件事就是把它放在一边真是太好了!这显然是正确的解决方案….+1。然而,没有任何一个
grep--help
man 1 grep
给出了这样的选项--虽然可以将它传递给
grep
@starrifwiw,
grep
也有一个选项来消除它分隔符,
--no group separator
@starrify奇而真--
man grep
没有列出您已经提到的选项,但是
info grep
会列出!
未识别的选项:--group separator
grep-V:2.5.1
。您使用的是什么构建?很抱歉,OP正在寻找要选择的行数在异常之前和之后,在每个块的末尾打印
===
行,而不是简单地在异常之后打印
==
行。我正在寻找一种方法来grep一些内容并使用sed将文本添加到所有匹配中,这在这方面很有帮助。另一种方法:
grep“match”| sed-n-e's/match/match\/n===/p'
您使用的是什么版本的
grep
?在什么平台上?您得到了什么输出/错误消息?有趣的是-我以前没有使用
-v
导入变量。这是一个非常灵活的解决方案。我喜欢它!默认情况下,您应该始终使用-v来导入awk变量th外部值。有关详细信息,请参阅。