如何从字符串中提取关键字值

Posted

技术标签:

【中文标题】如何从字符串中提取关键字值【英文标题】:How can I extract key word value from a string 【发布时间】:2020-05-25 05:33:57 【问题描述】:

我正在使用这个工具https://grokdebug.herokuapp.com/ 来测试我的 grok 解析器。我拥有的原始字符串类似于:

2020-05-01 01:59:10 server1 17.5.36.8 POST /v1/user.aspx r=1000&11:59:11.219&Method=Start&Credentials=xxxxxx:++http://localhost/v1/user.aspx&Reque

我想将数据解析为:


Method: Start,
r: 1000
Credential: xxxxx

我正在查看解析器 https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns,但我找不到一个好用的。

【问题讨论】:

【参考方案1】:

我不知道如何仅使用 grok 模式来实现这一点。如果您也在使用 Logstash,可以尝试以下解决方案:

图案:

%TIMESTAMP_ISO8601:timestamp\s%GREEDYDATA:server\s%IP:ip\s%GREEDYDATA:request_type\s%PATH:path\sr=%NUMBER:r&%TIME:some_time&Method=%GREEDYDATA:method&Credentials=%GREEDYDATA:username:%GREEDYDATA:password%MY_URI:uri

它适用于custom pattern:

MY_URI http://(?:%USER(?::[^@]*)?@)?(?:%URIHOST)?(?:%URIPATHPARAM)?

我使用了自定义模式,因为原始 %URI 模式中的 %URIPROTO 不会正确地将凭据与 uri 分开。我假设凭据以以下格式给出:

username:password

如果我错了,请替换:

Credentials=%GREEDYDATA:username:%GREEDYDATA:password

与:

Credentials=%GREEDYDATA:credentials

如果 :++ 字符串将凭据与 uri 分开,您可以使用它来应用 %URI 而不是 %MY_URI。

该模式适用于Grok Debugger。但是,Grok Constructor Matcher 中的输出更具可读性。

由于您只对某些领域感兴趣,请使用remove_field 插件。使用add_field 插件将结果包含在一个新字段中。

您的logstash.conf 文件可能如下所示(如果您将具有自定义模式的文件放在配置文件旁边的patterns 目录中):

# logstash.conf
…
filter 
    grok 
        patterns_dir => ["./patterns"]
        match => 
            "message" => "%TIMESTAMP_ISO8601:timestamp\s%GREEDYDATA:server\s%IP:ip\s%GREEDYDATA:request_type\s%PATH:path\sr=%NUMBER:r&%TIME:some_time&Method=%GREEDYDATA:method&Credentials=%GREEDYDATA:username:%GREEDYDATA:password%MY_URI:uri"
        
    mutate 
            add_field =>  "result" => "Method: %method, r: %r Credential: %username
            remove_field => ["timestamp", "server", "ip", "request_type", "path", "some_time", "password", "uri", "method", "r", "username"]
        
    
…

【讨论】:

以上是关于如何从字符串中提取关键字值的主要内容,如果未能解决你的问题,请参考以下文章

如何从字符串中提取值以在 Scala 中创建案例类实例

如何使用正则表达式和外壳从字符串中提取值?

如何从json字符串中提取值?

如何从邮递员的响应标头中提取特定的字符串值?

如何从javascript中的rgb字符串中提取颜色值[重复]

如何在 Python 中使用正则表达式从同一个字符串中提取多个值?