Ansible regex_search / regex_findall - PullRequest
       8

Ansible regex_search / regex_findall

1 голос
/ 21 марта 2020

Я пытаюсь проанализировать вывод команды, которая вернула строку, подобную этой (есть больше выходных данных, но это строка, которую я ищу):

Оставшееся время: 3 Минуты и 12 секунд

И когда времени не осталось, возвращается строка, подобная этой:

Оставшееся время: 0 секунд

Я хотел бы извлечь количество минут и секунд, чтобы я мог передать его в GNU date -d. Сначала я попробовал это:

- name: determine how much time we have left
    set_fact:
      time_left: "{{ cmd_output.stdout | regex_search(time_left_regex, '\\1', '\\2') | join(' ') }}"
    vars:
      time_left_regex: 'Remaining Time: ([0-9]+ Minutes) and ([0-9]+ Seconds)'

Но это не относится к случаю, когда не осталось времени. Тогда я попробовал что-то вроде этого:

- name: determine how much time we have left
    set_fact:
      time_left: "{{ cmd_output.stdout | regex_findall(time_left_regex, '\\1') }}"
    vars:
      time_left_regex: 'Next Execution:.*([0-9]{1,2} (Minutes|Seconds))'

Но это только возвращает что-то вроде:

ok: [localhost] => {"msg": "осталось времени: [ [u'2 Seconds ', u'Seconds']] "}

Я думаю, что я на правильном пути, но мне нужно лучшее регулярное выражение, так что, может быть, кто-нибудь может помочь мне здесь? Заранее большое спасибо.

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Можно разбить строку (строку) и объединить словарь. Например,

    - set_fact:
        time_left: "{{ time_left|default({})|
                       combine({myline[item]: myline[item+1]}) }}"
      loop: "{{ range(0, myline|length + 1, 3)|list }}"
      vars:
        myline: "{{ cmd_output.stdout.split(':').1.split()|reverse|list }}"
    - debug:
        var: time_left

для различных выходов команды

cmd_output.stdout: 'Remaining Time: 3 Minutes and 12 Seconds'
cmd_output.stdout: 'Remaining Time: 0 Seconds'
cmd_output.stdout: 'Remaining Time: 2 Days and 7 Hours and 3 Minutes and 12 Seconds'

дает (соответственно)

    "time_left": {
        "Minutes": "3", 
        "Seconds": "12"
    }
    "time_left": {
        "Seconds": "0"
    }
    "time_left": {
        "Days": "2", 
        "Hours": "7", 
        "Minutes": "3", 
        "Seconds": "12"
    }
0 голосов
/ 21 марта 2020

Вы можете сделать часть минут необязательной. Минуты будут в группе 1, а секунды - в группе 2.

Remaining Time: (?:([0-9]+ Minutes) and )?([0-9]+ Seconds)

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...