Возможное извлечение значения с использованием регулярных выражений - PullRequest
2 голосов
/ 17 октября 2019

У меня есть файл, аналогичный приведенному ниже.

SITE "A" (id:1,bindings:http/*:80:,net.tcp/808:*,net.pipe/*,state:Stopped)
SITE "B" (id:2,bindings:https/*:344:,net.tcp/325:*,net.pipe/*,state:Started)
SITE "C" (id:3,bindings:http/:80:xyz.domain.com,http/*:80:xyz,http/*:80:seiging,http/*:80:seiging.domain.com,state:Started)
SITE "D" (id:4,bindings:http/:901:,http/*:80:actdaov,state:Started)
SITE "E" (id:5,bindings:https/:443:idu.domain.com,http/*:80:idu.domain.com,state:Started)

Я хочу извлечь содержимое ниже.

"A, id: 1,",
"B, id: 2, ",
" C, id: 3, http / : 80: seiging.domain.com ",
" D, id: 4, ",
" E, id: 5, http /
: 80: idu.domain.com ",

Третье поле - если присутствует domain.com, мне нужно извлечь его, если нетпустой. Если существует более одного domain.com, тогда мне нужно взять последний.

Я попробовал, как показано ниже:

set_fact: inv_op="{{  item | regex_replace('SITE \\\"(.*)\\\" \((.*)\,bindings(.*)\,state.*', '\\1,\\2,\\3')  }}"

Вывод, как показано ниже:

"A, id: 1,: http / : 80:, net.tcp / 808: , net.pipe / ",
"B, id: 2,: https /
: 344:, net.tcp / 325: , net.pipe /"," C, id: 3,: http /: 80: xyz.domain.com, http / :80: xyz, http / : 80: seiging, http / : 80: seiging.domain.com ",
" D, id: 4,: http /: 901:, http /
: 80: actdaov ",
" E, id: 5,: https /: 443: idu.domain.com, http / *: 80: idu.domain.com ",

Пожалуйста, совет

1 Ответ

1 голос
/ 17 октября 2019

Возможно сначала создать словарь. Например, задачи

- set_fact:
    my_lines: "{{ lookup('file', 'data.csv').splitlines() }}"
- set_fact:
    my_lists: "{{ my_lists|default([]) + [item.split(' ')] }}"
  loop: "{{ my_lines }}"
- set_fact:
    my_dict: "{{ my_dict|default({})|
                 combine({item.1.1: {'id': item.2.split(',')[0].split(':')[1],
                                     'state': item.2.split(',')[-1].split(':')[1][:-1],
                                     'bindings': item.2.split(',')[1:-1]|
                                      map('regex_replace', 'bindings:', '')|list}})
                                      }}"
  loop: "{{ my_lists }}"

дают

"my_dict": {
    "A": {
        "bindings": [
            "http/*:80:", 
            "net.tcp/808:*", 
            "net.pipe/*"
        ], 
        "id": "1", 
        "state": "Stopped"
    }, 
    "B": {
        "bindings": [
            "https/*:344:", 
            "net.tcp/325:*", 
            "net.pipe/*"
        ], 
        "id": "2", 
        "state": "Started"
    }, 
    "C": {
        "bindings": [
            "http/:80:xyz.domain.com", 
            "http/*:80:xyz", 
            "http/*:80:seiging", 
            "http/*:80:seiging.domain.com"
        ], 
        "id": "3", 
        "state": "Started"
    }, 
    "D": {
        "bindings": [
            "http/:901:", 
            "http/*:80:actdaov"
        ], 
        "id": "4", 
        "state": "Started"
    }, 
    "E": {
        "bindings": [
            "https/:443:idu.domain.com", 
            "http/*:80:idu.domain.com"
        ], 
        "id": "5", 
        "state": "Started"
    }
}

Затем распечатайте данные. Например, задание

"Третье поле - если присутствует domain.com, мне нужно извлечь его, если нет, то оно должно быть пустым. Если существует более одного domain.com, то янужно взять последний. "

- debug:
    msg: |
      {{ item.key }},id:{{ item.value.id }},
      {%- if item.value.bindings|select('search', 'domain\.com')|list %}
      {{ item.value.bindings|select('search', 'domain\.com')|reverse|list|first }},
      {% endif %}
  loop: "{{ my_dict|dict2items }}"

дает

"msg": "A,id:1,\n"
"msg": "C,id:3,http/*:80:seiging.domain.com,\n"
"msg": "B,id:2,\n"
"msg": "E,id:5,http/*:80:idu.domain.com,\n"
"msg": "D,id:4,\n"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...