parse
parse 命令使用正则表达式从文本字段中提取信息,并将提取的信息添加到搜索结果中。它使用 Java 正则表达式模式。有关更多信息,请参阅 Java 正则表达式文档。
rex 和 parse 命令的比较
rex 和 parse 命令都使用带有命名捕获组的 Java 正则表达式从文本字段中提取信息。要比较 rex 和 parse 命令的功能,请参阅 rex 命令文档。
语法
parse 命令的语法如下:
parse <field> <pattern>
参数
parse 命令支持以下参数。
| 参数 | 必需/可选 | 描述 |
|---|---|---|
<field> |
必需 | 要解析的文本字段。 |
<pattern> |
必需 | 用于从指定文本字段提取新字段的正则表达式模式。如果已存在同名字段,其值将被替换。 |
正则表达式
正则表达式模式用于基于 Java 正则表达式语法 匹配每个文档的整个文本字段。表达式中的每个命名捕获组将成为新的 STRING 字段。
示例 1:创建新字段
以下查询从电子邮件地址中提取主机名。正则表达式模式 .+@(?<host>.+) 捕获 @ 符号后的所有字符,并创建一个新的 host 字段。解析空字段时,结果为空字符串:
source=accounts
| parse email '.+@(?<host>.+)'
| fields email, host
该查询返回以下结果:
| 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
该查询返回以下结果:

示例 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