将数组转换为另一个数组

问题描述 投票:0回答:2

我试图将输出数组转换为另一个数组。

假设我从命令输出以下内容:

kube-system        extension-apiserver-authentication   6         119d
kube-system        kube-dns                             0         119d
kube-system        kube-dns-autoscaler                  1         119d
kube-system        kube-flannel-cfg                     2         119d
kube-system        kubernetes-dashboard-settings        1         29d

我希望每个元素cut -d' ' -f2得到一个只包含第2列的数组。

就像Java 8中的list.stream().map(l -> l.getName()).collect(toList())一样。

为了在本地测试,我尝试使用ls -al作为

  1. ls -al一个文件夹;
  2. 得到第三列owner并返回所有者名单;

它的演示将是:


- name: Run in local to test loop
  hosts: 127.0.0.1 
  connection: local

  tasks:
  - name: List a folder
    shell: ls -al .
    register: result  

  - debug:
      msg: "{{ result.stdout_lines }}"

  - name: Get Second Separated by Space
    shell: echo '{{ item }}' | cut -d' ' -f3; # trying to get column 3
    loop: "{{ result.stdout_lines }}"
    register: result # this result is not what I am after :(

  - debug:
      msg: "{{ result }}"

对此有何意见?

F.Y.I

我的电脑中的ls -al输出类似于:

-rw-rw-r-- 1 hearen hearen     1 Sep   5 12:55 tmp
ansible
2个回答
0
投票

我用"{{ item.split()[2] }}"而不是cut -d' ' -f3来解决这个问题,使用cut元素有两种情况:

  1. 一个单一的任务,我可以直接用它来获取具体的column;

  - name: Get Second via split
    debug: 
      msg: "{{ item.split()[1] }}"
    loop: "{{ result.stdout_lines }}"
  1. 至于几个任务,我将使用循环块,你可以参考One loop over multiple Ansible tasksApply with_items on multiple tasksHow can Ansible loop over a sequence of tasks?

0
投票

不要使用Ansible来实现您在Bash和don't parse ls output中编写的代码。

如果您想获得所有者列表,可以这样做:

- name: List a folder
  find:
    path: .
  register: find

- debug:
    msg: "{{ find.files | map(attribute='pw_name') | list }}"
© www.soinside.com 2019 - 2024. All rights reserved.