gpt4 book ai didi

linux - 一个使用 xargs 在其他命令生成的搜索文本上 grep 输出一个命令的衬垫

转载 作者:行者123 更新时间:2023-12-03 09:58:45 25 4
gpt4 key购买 nike

我试图在一行中完成以下操作:

<command> | xargs -I {} grep {} <(other command)>

我有一个运行 Redis 和许多其他应用程序的 Kubernetes 集群。我想找出哪些应用程序(在本例中为 pod)连接到 Redis。

这可以分为两个步骤。
  • 获取连接到 Redis 的 IP 列表。
  • 获取包含这些 IP 的 pod 名称。

  • 我使用以下命令获得了 IP 列表:
    $ kubectl exec -it redis -- redis-cli -a <redis-auth> client list | tail -n +2 | awk -F '[:= ]' '{ print $4 }' | sort | uniq > test.txt
    $ cat test.txt
    10.52.1.194
    10.52.1.91
    10.52.2.44
    10.52.3.223
    127.0.0.1

    我还可以使用以下命令获取 pod 名称:
    $ grep -f test.txt <(kubectl get pods -o wide)
    app1 1/1 Running 0 9d 10.52.1.91 node-8 <none> <none>
    app2 2/2 Running 0 79d 10.52.2.44 node-14 <none> <none>
    app3 2/2 Running 2 79d 10.52.1.194 node-11 <none> <none>
    app4 1/1 Running 0 5d10h 10.52.3.223 node-30 <none> <none>

    我想在一行中完成这两项工作。我尝试了以下方法:
    $ kubectl exec -it redis -- redis-cli -a <redis-auth> client list | tail -n +2 | awk -F '[:= ]' '{ print $4 }' sort | uniq | xargs -t -I{} grep {} <(kubectl get pods -o wide)

    它打印以下命令(应该执行)但只执行第一个命令:
    grep 10.52.1.194 /dev/fd/63
    app3 2/2 Running 2 79d 10.52.1.194 node-11 <none> <none>
    grep 127.0.0.1 /dev/fd/63
    grep 10.52.1.91 /dev/fd/63
    grep 10.52.2.44 /dev/fd/63
    grep 10.52.3.223 /dev/fd/63

    我如何才能在一行中完成此操作。另外,我知道我可以给 name连接到 Redis 的每个客户端,但它需要更改我现在无法执行的应用程序代码。

    编辑:

    我给出的单行实际上部分工作,因为它只执行第一个 grep ...而不是所有 grep ...命令。谁能解释我在这里做错了什么?

    编辑 2:

    我的假设是,只有第一个 grep 命令有效,在第一个 grep 命令之后, /dev/fd/63可能指向一个不存在或空的文件。此外,以下命令出于某种原因起作用。谁能解释一下?
    $ kubectl exec -t redis -- redis-cli -a <redis-auth> client list | tail -n +2 | awk -F '[:= ]' '{ print $4 }' | sort -u | xargs -t -I{} bash -c 'grep -w {} <(kubectl get pods -o wide)'
    bash -c grep -w 10.52.1.194 <(kubectl get pods -o wide)
    app3 2/2 Running 2 80d 10.52.1.194 node-11 <none> <none>
    bash -c grep -w 10.52.1.91 <(kubectl get pods -o wide)
    app1 1/1 Running 0 10d 10.52.1.91 node-8 <none> <none>
    bash -c grep -w 10.52.2.44 <(kubectl get pods -o wide)
    app2 2/2 Running 0 80d 10.52.2.44 node-14 <none> <none>
    bash -c grep -w 10.52.3.223 <(kubectl get pods -o wide)
    app4 1/1 Running 0 6d10h 10.52.3.223 node-30 <none> <none>

    最佳答案

    你能试试这个吗:

    grep -f <(kubectl exec -t redis -- redis-cli -a <redis-auth> client list | tail -n +2 | awk -F '[:= ]' '{ print $4 }' | sort | uniq) <(kubectl get pods -o wide)

    如果遇到问题,请先使用此命令进行故障排除:
    cat <(kubectl exec -t redis -- redis-cli -a <redis-auth> client list | tail -n +2 | awk -F '[:= ]' '{ print $4 }' | sort | uniq)
    cat <(kubectl get pods -o wide)

    关于linux - 一个使用 xargs 在其他命令生成的搜索文本上 grep 输出一个命令的衬垫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59514326/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com