parse

parse 命令使用正则表达式从文本字段中提取信息,并将提取的信息添加到搜索结果中。它使用 Java 正则表达式模式。有关更多信息,请参阅 Java 正则表达式文档

rex 和 parse 命令的比较

rexparse 命令都使用带有命名捕获组的 Java 正则表达式从文本字段中提取信息。要比较 rexparse 命令的功能,请参阅 rex 命令文档

语法

parse 命令的语法如下:

parse <field> <pattern>

参数

parse 命令支持以下参数。

参数 必需/可选 描述
<field> 必需 要解析的文本字段。
<pattern> 必需 用于从指定文本字段提取新字段的正则表达式模式。如果已存在同名字段,其值将被替换。

正则表达式

正则表达式模式用于基于 Java 正则表达式语法 匹配每个文档的整个文本字段。表达式中的每个命名捕获组将成为新的 STRING 字段。

示例 1:创建新字段

以下查询从电子邮件地址中提取主机名。正则表达式模式 .+@(?<host>.+) 捕获 @ 符号后的所有字符,并创建一个新的 host 字段。解析空字段时,结果为空字符串:

source=accounts
| parse email '.+@(?<host>.+)'
| fields email, host

该查询返回以下结果:

email host
amberduke@pyrami.com pyrami.com
hattiebond@netagy.com netagy.com
null
daleadams@boink.com boink.com

示例 2:覆盖现有字段

以下查询用仅包含街道名称的内容替换 address 字段,移除了街道号码。正则表达式模式 \d+ (?<address>.+) 匹配数字后跟一个空格,然后将剩余文本捕获为新的 address 值:

source=accounts
| parse address '\d+ (?<address>.+)'
| fields address

该查询返回以下结果:

../../../../_images/parse-2.png

示例 3:解析、过滤和排序地址组件

以下查询从地址中提取街道号码和名称,然后过滤出大于 500 的街道号码并按数字排序。正则表达式模式 (?<streetNumber>\d+) (?<street>.+) 将数字部分捕获为 streetNumber,剩余文本捕获为 street

source=accounts
| parse address '(?<streetNumber>\d+) (?<street>.+)'
| where cast(streetNumber as int) > 500
| sort num(streetNumber)
| fields streetNumber, street

该查询返回以下结果:

streetNumber street
671 Bristol Street
789 Madison Street
880 Holmes Lane

限制

parse 命令有以下限制:

  • parse 命令创建的字段不能再次被解析。例如,以下命令无法按预期工作:

    source=accounts | parse address '\d+ (?<street>.+)' | parse street '\w+ (?<road>\w+)'
    
  • parse 命令创建的字段不能被其他命令覆盖。例如,在以下查询中,where 子句无法匹配任何文档,因为 street 不能被覆盖:

    source=accounts | parse address '\d+ (?<street>.+)' | eval street='1' | where street='1'
    
  • parse 命令使用的源文本字段不能被覆盖。例如,在以下查询中,street 字段解析不正确,因为 address 被覆盖了:

    source=accounts | parse address '\d+ (?<street>.+)' | eval address='1'
    
  • parse 命令创建的字段在 stats 命令中使用后,不能被过滤或排序。例如,在以下查询中,where 子句无法按预期工作:

    source=accounts | parse email '.+@(?<host>.+)' | stats avg(age) by host | where host=pyrami.com
    
  • parse 命令创建的字段不会出现在最终结果中,除非原始源字段包含在 fields 命令中。例如,除非显式包含源字段 email,否则以下查询不会返回解析后的字段 host

    source=accounts | parse email '.+@(?<host>.+)' | fields email, host