Bash 如何分别处理每个grep(带-A选项)结果?不是按行,而是按项目
我有一个很长的日志要解析,每个事件的日志消息通常需要不止一行。如果我使用每个事件的硬编码行号,那么我可以使用Bash 如何分别处理每个grep(带-A选项)结果?不是按行,而是按项目,bash,shell,Bash,Shell,我有一个很长的日志要解析,每个事件的日志消息通常需要不止一行。如果我使用每个事件的硬编码行号,那么我可以使用grep-A$EventLineNumbers来获取每个事件的整个消息 现在,例如,我想在一个事件中用20行消息grep两个数据字段。该事件可能会在日志中记录100次。我希望避免逐行处理grep结果,因为如果其中一个事件中不存在一个数据字段,我将从另一个事件中获取数据,并将其与前一个事件“捆绑”在一起 简而言之,如果我在命令中设置了-a选项,那么如何单独处理每个grep?对于这种解析,我将
grep-A$EventLineNumbers
来获取每个事件的整个消息
现在,例如,我想在一个事件中用20行消息grep两个数据字段。该事件可能会在日志中记录100次。我希望避免逐行处理grep结果,因为如果其中一个事件中不存在一个数据字段,我将从另一个事件中获取数据,并将其与前一个事件“捆绑”在一起
简而言之,如果我在命令中设置了-a选项,那么如何单独处理每个grep?对于这种解析,我将使用awk(1)。与grep(1)相比,它允许您轻松地使用变量和条件。因此,您可以:
1
2
3
1
4
5
6
2
4
假设所有块都是3行,并且您希望将块与其中的1
匹配。以下代码起作用:
echo -e '1\n2\n3\n1\n4\n5\n6\n2\n4' | grep 1 -A2 | awk -v n=3 '{print} NR % 3 == 0 { printf "\0" }' | xargs -0 -n 1 echo -n "WOOT: "
说明:
grep1-A2
是查找相关块的表达式。我假设匹配表达式在每个块中只出现一次。-A2
用于匹配后的两行上下文
awk-v'{print}NR%3==0{printf“\0”}
部分指示awk每3行打印一个\0字符。再次针对相关块大小调整此值。下一个命令需要这个
xargs-0-n1
部分执行下一个命令(这对您来说是额外的过滤器),为它提供整个块<代码>-0用于空终止项(一个块)和-n1
仅用于将单个项传递给下一个命令
在我的示例中,这将给出以下输出:
WOOT: 1
2
3
WOOT: 1
4
5
这意味着每个块只执行一次echo。记录的事件是否有边界或标记,您可以用来检测日志/流中的每个事件?您需要包括一小部分样本数据,这些数据包括您描述的问题以及预期的输出。读者可以直接进入基于证据的Q/A,但当有问题的叙述性描述时,可以玩20个Q。使用高亮文本编辑框左上角的
{}
工具保持代码/数据/输出/errmsgs/等的正确格式。祝你好运。