Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何分别处理每个grep(带-A选项)结果?不是按行,而是按项目_Bash_Shell - Fatal编程技术网

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)相比,它允许您轻松地使用变量和条件。因此,您可以:

  • 在表示您感兴趣的一系列行的开始的行上进行匹配
  • 设置一个变量以记住此状态
  • 流程行如下,记住相关字段
  • 当您到达这一行的末尾时,打印格式化的信息
  • 如果事实上,这些行并不有趣,您可以重置状态并跳到下一条有趣的消息

    该命令将比简单的grep长,但它仍然简洁,您不需要使用完整的编程语言。

    这应该可以:

    输入示例:

    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/等的正确格式。祝你好运。