首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一行上执行regex_findall和split()

在同一行上执行regex_findall和split()
EN

Stack Overflow用户
提问于 2020-07-15 01:58:59
回答 2查看 1K关注 0票数 2

下面是我试图解析的输出:

代码语言:javascript
复制
hostname#show bgp vrf vrfname summary | i 1.1
BGP Route Distinguisher: 1.1.1.1:0
BGP router identifier 1.1.1.1, local AS number 2222
1.1.1.3      0 64512  349608  316062   896772    0    0     2w4d          1

我有下面的正则表达式,它只匹配最后一行。现在,我需要拆分该行并查看最后一个索引。在本例中,它是"1",但如果该值是"0“,我希望失败。

代码语言:javascript
复制
- name: debug test
  debug:
    msg: "{{show_bgp_sessions.data | regex_findall('\\d+\\.\\d+\\.\\d+\\.\\d+\\s\\s.*')}}"

我尝试在"msg“行的末尾添加几种不同格式的拆分,这样就可以在failed_when语句中获取最后一个索引进行比较:

代码语言:javascript
复制
msg: "{{show_bgp_sessions.data | regex_findall('\\d+\\.\\d+\\.\\d+\\.\\d+\\s\\s.*') | split(' ')}}"

但是我得到了以下错误消息:

代码语言:javascript
复制
 "template error while templating string: no filter named 'split'. String:

我还尝试使用几种不同形式的"ends_with“来验证字符串中的最后一个索引,因为我在python经验中经常使用它,但我不能让它在ansible中工作。我不能创建一个新任务来解析数据并单独执行拆分,因为我需要通过循环运行此验证。

EN

回答 2

Stack Overflow用户

发布于 2020-07-15 03:43:13

选择该行时,反转字符串,然后拆分第一个项目。例如

代码语言:javascript
复制
msg: "{{ (my_line|reverse).split()|first }}"
票数 2
EN

Stack Overflow用户

发布于 2020-07-15 03:37:35

@Thefourthbird提供的正则表达式可能是更好的解决方案。

但是对于你手头的问题,这是由Jinja中确实没有过滤器split的事实引起的,请参见列表:https://jinja.palletsprojects.com/en/2.11.x/templates/#list-of-builtin-filters

没有这样的过滤器的原因很简单:split()是Python String的一个函数,因为Jinja是Python,所以您可以直接使用它。

还要记住,由于regex_findall用于多个匹配,因此您必须选择列表的第一个元素,例如,使用过滤器first

所以你的消息最终是:

代码语言:javascript
复制
msg: "{{ (show_bgp_sessions.data | regex_findall('\\d+\\.\\d+\\.\\d+\\.\\d+\\s\\s.*') | first).split() }}

给定攻略:

代码语言:javascript
复制
- hosts: all
  gather_facts: no
  vars:
    show_bgp_sessions:
      data: |
        hostname#show bgp vrf vrfname summary | i 1.1
        BGP Route Distinguisher: 1.1.1.1:0
        BGP router identifier 1.1.1.1, local AS number 2222
        1.1.1.3      0 64512  349608  316062   896772    0    0     2w4d          1
        
  tasks:
    - debug:
        msg: "{{ (show_bgp_sessions.data | regex_findall('\\d+\\.\\d+\\.\\d+\\.\\d+\\s\\s.*') | first).split() }}"

给出了总结:

代码语言:javascript
复制
PLAY [all] *********************************************************************************************

TASK [debug] *******************************************************************************************
ok: [localhost] => {
    "msg": [
        "1.1.1.3",
        "0",
        "64512",
        "349608",
        "316062",
        "896772",
        "0",
        "0",
        "2w4d",
        "1"
    ]
}

PLAY RECAP *********************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62901208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档