【问题标题】:using regex_findall to filter output使用 regex_findall 过滤输出
【发布时间】:2019-06-28 09:10:21
【问题描述】:

我正在使用正则表达式 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": []
 }

【问题讨论】:

  • 请检查您的问题,添加更多细节;如果我们看不到 env.stdout[0] 中的实际内容,我们应该如何知道为什么正则表达式不匹配?
  • 内容太大,无法分享,但正则表达式应匹配此部分:CPU 利用率五秒:13%/0%;一分钟:6%;五分钟:4%;只会提取 1 分钟的值

标签: regex ansible yaml


【解决方案1】:

Regex' 使用反斜杠转义,当您使用双引号标量时,YAML 也使用反斜杠转义,就像您一样。那就是要求问题和不可读性。

您需要在 msg 的值中加倍和反斜杠,使用单引号(其中只有单引号可以并且需要通过加倍来转义),或者,这是最好的解决方案到目前为止,使用 YAML 的块样式文字标量(带有适当的 chomping):

- 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.*$') }}

【讨论】:

  • 起初它在执行剧本之前返回了一条错误消息,所以我在这个正则表达式中加倍了反斜杠以修复它。同样使用 YAML 的块样式返回相同的结果:空消息
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2016-12-18
  • 2021-07-02
相关资源
最近更新 更多