簡體   English   中英

Ansible 使用正則表達式提取值

[英]Ansible extract value using regex

我有一個類似於下面的文件。

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')  }}"

Output 如下:

"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",

請指教

可以先創建字典。 例如任務

- 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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM