如何向字典添加过滤

时间:2019-05-15 19:21:58

标签: json list dictionary ansible

我正在尝试从以数字1结尾的字典中查询列表。

这是我正在尝试的方法,但是我得到的输出为空列表。

    - name: Get list of sid that are open in READ WRITE mode
      set_fact:
        sid_output: "{{ om.results | selectattr(\"sid\", \"match\", \"1$\") | map(attribute='sid') | list}}"

这是我字典的输出:

{
   'msg':u'All items completed',
   'changed':True,
   'results':[  
      {  
         '_ansible_parsed':True,
         'stderr_lines':[  

         ],
         u'cmd':u'echo \"set pagesize 0\\nselect trim(open_mode) from v\\\\$database;\" | /u01/app/oracle/product/11.2.0/dbinst_1/bin/sqlplus -S / as sysdba',
         u'end':         u'2019-05-15 12:04:30.478084         ', '         _ansible_no_log':False,
         u'stdout':u'READ WRITE',
         '_ansible_item_result':True,
         u'changed':True,
         u'sid':u'dw1',
         'failed':False,
         u'delta':         u'0:00:00.073102         ', u'         stderr':u'',
         u'rc':0,
         u'invocation':{  
            u'module_args':{  
               u'creates':None,
               u'executable':None,
               u'_uses_shell':True,
               u'_raw_params':u'echo \"set pagesize 0\\nselect trim(open_mode) from v\\\\$database;\" | /u01/app/oracle/product/11.2.0/dbinst_1/bin/sqlplus -S / as sysdba',
               u'removes':None,
               u'argv':None,
               u'warn':True,
               u'chdir':None,
               u'stdin':None
            }
         },
         'stdout_lines':[  
            u'READ WRITE'
         ],
         u'start':         u'2019-05-15 12:04:30.404982         ', '         _ansible_ignore_errors':None,
         '_ansible_item_label':u'dw1'
      }
   ]
}

1 个答案:

答案 0 :(得分:0)

您的问题是使用match测试。来自documentation on search vs. match

  

“匹配”要求字符串中的完全匹配,而“搜索”仅需要匹配字符串的子集。

换句话说,如果您尝试使用some_match is match('foo.*bar')进行测试,则意味着字符串必须以foo开头并以bar结尾。如果您测试some_mastch is match('bar$'),那么您正在寻找的是与bar完全相同的字符串。

由于您正在使用:

selectattr(\"sid\", \"match\", \"1$\")

这意味着它将仅匹配完全等于1的字符串。您想改用search。而当您使用它时,请摆脱所有那些用引号引起来的双引号:

- set_fact:
    sid_output: "{{ om.results | selectattr('sid', 'search', '1$') | map(attribute='sid') | list}}"

使用您的示例数据,这会将sid_output设置为dw1