regex - 如何从 ansible 调试的字典键值中删除不需要的字符串
问题描述
当我运行 ansible playbook 时,我有以下输出
ok: [localhost] => {
"msg": [
{
"last-heard-processing-time": "18611 secs ago(took 15 secs)",
"name": "XXXX",
"status": "conn:Getting ALL"
},
{
"last-heard-processing-time": "20375 secs ago(took 17 secs)",
"name": "AAAA",
"status": "conn:Getting ALL"
},
{
"last-heard-processing-time": "20292 secs ago(took 11 secs)",
"name": "BBBB",
"status": "conn:Getting ALL"
},
{
"last-heard-processing-time": "4 secs ago(took 13 secs)",
"name": "CCCC",
"status": "conn:idle"
},
{
"last-heard-processing-time": "51 secs ago(took 10 secs)",
"name": "DDDD",
"status": "conn:idle"
},
{
"last-heard-processing-time": "53 secs ago(took 10 secs)",
"name": "EEEEE",
"status": "conn:idle"
},
{
"last-heard-processing-time": "9 secs ago(took 10 secs)",
"name": "FFFF",
"status": "conn:idle"
}
]
}
需要专家的一些帮助/提示/线索(我是 ansible 的新手)我需要使用哪个过滤器来删除“last-heard-processing-time”键值中的额外字符串,以便我可以低于输出,我只需要last-heard-processing-time 键值中的第一个数字
ok: [localhost] => {
"msg": [
{
"last-heard-processing-time": "18611",
"name": "XXXX",
"status": "conn:Getting ALL"
},
{
"last-heard-processing-time": "20375",
"name": "AAAA",
"status": "conn:Getting ALL"
},
{
"last-heard-processing-time": "20292",
"name": "BBBB",
"status": "conn:Getting ALL"
},
{
"last-heard-processing-time": "4",
"name": "CCCC",
"status": "conn:idle"
},
{
"last-heard-processing-time": "51",
"name": "DDDD",
"status": "conn:idle"
},
{
"last-heard-processing-time": "53",
"name": "EEEEE",
"status": "conn:idle"
},
{
"last-heard-processing-time": "9",
"name": "FFFF",
"status": "conn:idle"
}
]
}
我正在尝试使用 regex_replace
msg: "{{output.msg| regex_replace('\\d+\\ssecs\\sago\\(took\\s\\d+\\ssecs\\)', '\\d+')}}"
出错
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: re.error: bad escape \d at position 0
fatal: [localhost]: FAILED! => {}
解决方案
创建第一个数字的列表,.eg
- set_fact:
time: "{{ output.msg|
map(attribute='last-heard-processing-time')|
map('regex_replace', '^(\\d+)\\s+.*$', '\\1') }}"
给
time:
- '18611'
- '20375'
- '20292'
- '4'
- '51'
- '53'
- '9'
然后结合更新的字典并连接列表
- set_fact:
out: "{{ out|d([]) +
[item.0|combine({'last-heard-processing-time': item.1})] }}"
with_together:
- "{{ output.msg }}"
- "{{ time }}"
给
out:
- last-heard-processing-time: '18611'
name: XXXX
status: conn:Getting ALL
- last-heard-processing-time: '20375'
name: AAAA
status: conn:Getting ALL
- last-heard-processing-time: '20292'
name: BBBB
status: conn:Getting ALL
- last-heard-processing-time: '4'
name: CCCC
status: conn:idle
- last-heard-processing-time: '51'
name: DDDD
status: conn:idle
- last-heard-processing-time: '53'
name: EEEEE
status: conn:idle
- last-heard-processing-time: '9'
name: FFFF
status: conn:idle
更新时间属性的值是一个字符串。如果您想要一个整数,请添加int过滤器。
- set_fact:
time: "{{ output.msg|
map(attribute='last-heard-processing-time')|
map('regex_replace', '^(\\d+)\\s+.*$', '\\1')|
map('int') }}"
推荐阅读
- twitter - 如何在 dataweave 2.0 中将 twitter created_at 转换为 datetime?
- wordpress - Wordpress REST API 遇到 docker 和 docker-compose 错误
- javascript - 事件仅单击 x 轴标签 chartJS
- python - 如何将列添加到依赖于数据帧或外部数据帧中组的平均值的数据帧?
- r - For 循环使用自定义匹配函数按所有行比较 2 个数据帧
- reactjs - 我如何在 npm run build 期间包含一个文件夹/文件来 getminnify?
- android - Opengl Android 如何绘制平滑纹理
- python - 是否可以托管不使用 Web 服务的 python 脚本?
- c# - 使用 Xamarin C# 将 JSON 值转换为类型“System.Collections.Generic.List”时出错
- javascript - 正则表达式最多允许 3 个数字和一个点