#pattern #grep #grok #utility #fields #columns #filter

bin+lib grop

Grup 是一个由 grok 驱动的类似 grep 的 CLI 工具,允许用户以不同的方式操作以 grok 分隔的列

2 个不稳定版本

0.2.0 2020年5月24日
0.1.0 2020年5月23日

#2014 in 解析实现

MIT 许可证

34KB
809

Grup

Grup 是一个由 grok 驱动的类似 grep 的 CLI 工具,允许用户以不同的方式操作以 grok 分隔的列(例如,通过列过滤行)。

安装

cargo install grop

使用方法

A grok powered grep-like utility

USAGE:
    grop [FLAGS] [OPTIONS] [--] [input]

FLAGS:
    -h, --help                     Prints help information
        --merge-scope-exclusive    Whether to take the line matching `merge_exp_end` as part of the merged section
    -q, --quiet                    Silence all output
    -V, --version                  Prints version information
    -v, --verbose                  Verbose mode (-v, -vv, -vvv, etc)

OPTIONS:
        --config <config-file>                 Config file in toml format. A sample file could be found at
                                               "doc/sample.toml"
    -e, --expression <expression>              Grok match expression
        --filter <filter>...                   Filter to include (`field_name pattern`) or exclude (`-field_name
                                               pattern`) some pattern
    -l, --list-pattern <list-pattern>          List available patterns
        --merge-exp-end <merge-exp-end>        Grok match expression indicating the end of the merged section
        --merge-exp-start <merge-exp-start>    Grok match expression indicating the start of the merged section
    -m, --merge-field <merge-field>...         Field(s) to be merged among lines. The unspecified fields will be skipped
                                               and only keep the ones in first line
    -o, --output-format <output-format>        Output format (fields of grok expression, separated by comma)
    -p, --pattern <pattern>...                 Custom Grok pattern (format: `<pattern_name> <regexp>`)

ARGS:
    <input>    Input file, stdin if not present

动机

terraform-provider-azurerm 将输出日志日志,我想有一种方法可以过滤掉不感兴趣的日志。

一些日志可以使用如 grep -v 这样的工具轻松过滤,只要这些日志是一行。

然而,由于 terraform 的“自动分割行”功能,一些由 Azure Go SDK 生成的日志是多行的有效负载。这种类型的日志将被分割成多个日志,并带有一些 terraform 日志格式化(例如,时间戳、日志级别等)。当您通过终端/文件查看整个日志文件时,这个功能很好。但是,当您想要过滤时,它使得像 grep -v 这样的工具变得无用,因为 grep 是基于行的工具,它没有关于跨越多行的有效负载完整性的知识。

这就是 grop 能发挥作用的地方!grop 以管道风格工作

  1. 使用 grok 对输入进行结构化
  2. 根据合并模式(起始行模式、结束行模式,支持包含合并和排除合并)合并一个或多个结构化字段
  3. 根据(合并的)字段级别模式进行过滤/输出
  4. 格式化输出(例如,仅提取感兴趣的字段)

以下是一个示例片段,说明如何过滤掉一些不感兴趣的日志,用于 terraform-provider-azurerm

$ TF_LOG=DEBUG terraform plan 2>&1 | tee /tmp/tf.log | \
    grop -p "LOGLEVEL DEBUG|INFO|WARN|ERROR" \
         -p "PROVIDER_SUBJECT plugin.terraform-provider-azurerm" \
         -e "%{TIMESTAMP_ISO8601:ts} \[%{LOGLEVEL:lvl}\] %{PROVIDER_SUBJECT}: %{GREEDYDATA:data}" \
         -m data \
         --merge-exp-start=".* AzureRM Request|Response" \
         --merge-exp-end="%{TIMESTAMP_ISO8601:ts} \[%{LOGLEVEL:lvl}\] %{PROVIDER_SUBJECT}: \[DEBUG\]" \
         --merge-scope-exclusive \
         --filter="-data \[DEBUG\] AzureRM Client User Agent" \
         --filter="-data \[DEBUG\] Registering" \
         -o ts,data

依赖项

~7–16MB
~221K SLoC