You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除Grok模式匹配中program1字段的方括号及内部数字

统一提取程序名的Grok模式调整方案

最终可用的Grok模式

<%{NUMBER:syslogpri}>%{SYSLOGTIMESTAMP:timestamp} %{NOTSPACE:syslog_device_hostname} %{WORD:program1}(?:\[%{NUMBER:program_number}\])?:%{GREEDYDATA:message}

调整逻辑说明

原模式中%{NOTSPACE:program1}会把sudo[4077568]整个当作程序名,这是因为NOTSPACE会匹配所有非空白字符,包括括号和进程号。调整后:

  • %{WORD:program1}:仅匹配字母数字组成的程序名(比如sudo),直接提取核心程序名称,排除后续的进程号后缀。
  • (?:\[%{NUMBER:program_number}\])?:这就是你疑惑的非捕获组用法:
    • (?:...):表示这个组仅用于匹配逻辑,不会生成额外的无名捕获字段(如果去掉?:,会多一个无意义的捕获项);
    • 内部的%{NUMBER:program_number}是命名捕获,专门提取进程号;
    • 末尾的?标记这个组为可选,确保没有进程号的日志(比如第一条)也能正常匹配。

匹配结果验证

第一条日志匹配

<85>May 8 11:26:40 test123 sudo: LCOpsMGRSCX : (command blablalblablalblalba) asdasldma

提取字段:

  • syslogpri: 85
  • timestamp: May 8 11:26:40
  • syslog_device_hostname: test123
  • program1: sudo
  • message: LCOpsMGRSCX : (command blablalblablalblalba) asdasldma
    (无进程号,program_number字段不会生成)

第二条日志匹配

<85>May 7 20:52:15 test123 sudo[4077568]: program : TTY=pts/0 ;

提取字段:

  • syslogpri: 85
  • timestamp: May 7 20:52:15
  • syslog_device_hostname: test123
  • program1: sudo
  • program_number: 4077568
  • message: program : TTY=pts/0 ;

非捕获组核心作用总结

非捕获组(?:...)主要用来组织匹配规则,同时避免生成冗余的无名捕获字段。它和普通捕获组(...)的区别是:普通组会额外生成一个无名的捕获结果(比如正则中的$1),而非捕获组只执行匹配逻辑,不产生额外输出,让你的字段提取更干净。

内容的提问来源于stack exchange,提问作者h0llym0lly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:22:13