【问题标题】:bash/shell - grep exact message structure from a big log filebash/shell - 从大日志文件中 grep 确切的消息结构
【发布时间】:2015-05-09 17:42:27
【问题描述】:

我想就以下问题向您提供建议。 我有一个包含多种消息类型的大日志文件,但我只需要 grep 始终看起来像以下消息类型:

2015-03-05 15:00:05,294 abcdefgddd {
 msgType: abcsefg
gggggg {
  sendingTime: 1425567605270
  xxxx: 
  yyy {
    timestamp: 1425567605211
    zzz: 
    qqq: 
    vvv: 
  }
  yyy {
    timestamp: 1425567605211
    zzz: 
    qqq: 
    vvv: 
  }
  aaa {
    timestamp: 1425567605211
    zzz: 
    qqq: 
    vvv: 
  }
  aaa {
    timestamp: 1425567605211
    zzz: 
    qqq: 
    vvv: 
  }
}
}

这是消息结构。 我怎样才能在 Linux shell 中只 grep 那个结构。可以使用 awk/grep/sed 或任何其他建议。

谢谢大家。

【问题讨论】:

  • 你想抢全吗?
  • 是的。确切地。边界之间的整个信息。
  • 本节前后的数据是什么?
  • 将其视为任何数据。这是一个日志文件。有几条消息,而每个消息都以时间戳开头。

标签: bash shell awk sed grep


【解决方案1】:

由于我们不知道文件的其余部分,我们只能猜测。
这个gnu awk将数据栈分成组,按年份分隔。

awk -v RS="^2015" 'NR>1 {print RS$0}' file

只获取一个部分:

awk '/^2015-03-05 15:00:05/ {f=1} /{/ {c++} /}/ {c--} f && c; !c {f=0}' file

这将从日期2015-03-05 15:00:05 开始打印,直到所有{} 关闭。

【讨论】:

  • 但在该消息之前和之后,我还有其他消息以时间戳开头。
  • @Assafbaruch 所以你只需要一个块,如果是这样,只取这个部分的触发器是什么?查看我更新的帖子。
  • 正好需要那个块。但它总是以“msgType:abcsefg”开头,总是以“}”结尾
  • @Assafbaruch 所以你需要在触发器上方一行?
  • 不,我需要块中的所有行。正如我在第一条消息中提到的那样(=
猜你喜欢
  • 2011-12-31
  • 2015-02-23
  • 2014-04-29
  • 2019-07-22
  • 2013-08-31
  • 2019-02-04
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
相关资源
最近更新 更多