使用regex_findall过滤输出

时间:2019-02-04 15:27:36

标签: regex ansible yaml

我正在使用正则表达式find_all来过滤网络命令的输出,我已经使用regex101对输出进行了正则表达式测试,并且我确定它是正确的,输出也符合预期,但是当我尝试过滤时,我认为在剧本中不匹配。结果,我总是得到一个空白的味精。

- name: extract env
 lineinfile:                                 
   line: "{{ env.stdout[0] }}"
   dest: "{{ output_path }}/env_of_{{inventory_hostname}}.csv"
   create: True
-  debug:
   msg: "{{ env.stdout[0] | regex_findall('^.*one minute: (\\d+%); five.*$') }}"

输出应为百分比形式的数字,但这是我得到的:

TASK [debug] ********************************************************************************************************
task path: /ansible/testcsv.yml:60
ok: [R1] => {
"msg": []
 }
ok: [R2] => {
"msg": []
 }
ok: [R3] => {
"msg": []
 }

1 个答案:

答案 0 :(得分:0)

Regex'使用反斜杠转义,当您使用双引号标量时,YAML也是如此。那就是在问问题和无法阅读。

您可能需要将msg的值加倍并加反斜杠,使用单引号(在其中只能将单引号加倍而转义),或者就是迄今为止最好的解决方案,请使用YAML的块样式文字标量(适当的加粗处理):

- name: extract env
 lineinfile:                                 
   line: |-
     {{ env.stdout[0] }}
   dest: |-
      {{ output_path }}/env_of_{{inventory_hostname}}.csv
   create: True
-  debug:
   msg: |-
      {{ env.stdout[0] | regex_findall('^.*one minute: (\\d+%); five.*$') }}