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
相关产品推荐
相关产品推荐

