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

Ansible Playbook提取df START与df END间内容正则报错如何解决

问题原因
  • 正则表达式未用引号包裹,Jinja2模板引擎将正则中的?等特殊符号识别为模板语法字符,直接触发解析报错
  • exp.stdout_lines是列表类型,regex_search过滤器默认处理字符串类型,直接传入列表无法完成匹配
解决实现方案

方案1:正则匹配实现

先将列表拼接为多行字符串,再用正则提取,适合起止标记可能存在前后缀的场景:

- set_fact:
    result: "{{ exp.stdout_lines | join('\n') | regex_search('(?<=df START\n).*?(?=\ndf END)', multiline=True, dotall=True) | split('\n') }}"

参数说明:

  • join('\n'):将列表每行用换行符拼接为完整的多行字符串
  • 正则用单引号包裹,避免Jinja2误解析正则特殊字符
  • dotall=True:允许.匹配换行符
  • multiline=True:开启多行匹配模式
  • 最后用split('\n')将匹配结果转回列表,和原stdout_lines格式保持一致

方案2:列表切片实现

逻辑更直观,不需要复杂正则,适合起止标记为单独一行的场景:

- set_fact:
    start_idx: "{{ exp.stdout_lines.index('df START') + 1 }}"
    end_idx: "{{ exp.stdout_lines.index('df END') }}"
- set_fact:
    result: "{{ exp.stdout_lines[start_idx | int : end_idx | int] }}"
最终输出效果

两种方案得到的result均为如下格式的目标列表:

[
  "df -h",
  "Filesystem      Size  Used Avail Use% Mounted on",
  "udev            476M     0  476M   0% /dev",
  "tmpfs           100M   11M   89M  11% /run",
  "/dev/sda1       218G  1.9G  205G   1% /",
  "tmpfs           497M     0  497M   0% /dev/shm",
  "tmpfs           5.0M     0  5.0M   0% /run/lock",
  "tmpfs           497M     0  497M   0% /sys/fs/cgroup",
  "/dev/sda2       923M   59M  802M   7% /boot",
  "/dev/sda4       266G  306M  252G   1% /home",
  "tmpfs           100M     0  100M   0% /run/user/1001",
  "\u001b]0;",
  ""
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:27:03