[英]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.