首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个用于使用xargs对由其他命令生成的搜索文本上的一个命令的grep输出的班轮。

一个用于使用xargs对由其他命令生成的搜索文本上的一个命令的grep输出的班轮。
EN

Stack Overflow用户
提问于 2019-12-28 19:45:00
回答 2查看 445关注 0票数 2

我正试图用一句话来完成以下工作:

代码语言:javascript
复制
<command> | xargs -I {} grep {} <(other command)>

我有一个Kubernetes集群,它运行Redis和许多其他应用程序。我想知道哪些应用程序(在本例中为pods)连接到Redis。

这可以分两步进行。

  • 获取连接到Redis的IP列表。
  • 获取保存这些IP的荚名。

我使用以下命令获得了IP列表:

代码语言:javascript
复制
$ 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

我还可以使用以下命令获取吊舱名称:

代码语言:javascript
复制
$ 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>

我想在一条线上完成这两件事。我尝试了以下几点:

代码语言:javascript
复制
$ 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)

它打印以下命令(应该执行),但只执行第一个命令:

代码语言:javascript
复制
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

我怎样才能在一条线上完成这件事。另外,我知道我可以给每个连接到Redis的客户端提供一个name,但是它需要更改应用程序代码,而我现在不能这样做。

编辑:

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

Edit2:

我认为只有第一个grep命令起作用的假设是,在第一个grep命令之后,/dev/fd/63可能指向一个不存在或空的文件。另外,以下命令因某些原因而起作用。有人能解释吗?

代码语言:javascript
复制
$ 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>
EN

回答 2

Stack Overflow用户

发布于 2019-12-28 21:38:26

你能试试这个吗?

代码语言:javascript
复制
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)

如果您有问题,请先使用以下命令来解决问题:

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2019-12-28 22:45:51

试着简单地:

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

或相同:

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

注1:这仍然是一行,您可以剪切‘n粘贴,甚至删除新行。只是更容易重读。

注2:sort | uniq可以由sort -u简化

代码语言:javascript
复制
kubectl exec -it redis -- redis-cli -a <redis-auth> client list |
    tail -n +2 |
    awk -F '[:= ]' '{ print $4 }' |
    sort -u |
    grep -f - <(kubectl get pods -o wide)

但您可以在事件中这样写:

代码语言:javascript
复制
grep -f <(
    kubectl exec -it redis -- redis-cli -a <redis-auth> client list |
        tail -n +2 |
        awk -F '[:= ]' '{ print $4 }' |
        sort -u
  ) <(
    kubectl get pods -o wide
  )

可以用两行重写:

代码语言:javascript
复制
grep -f <(kubectl exec -it redis -- redis-cli -a <redis-auth> client list |
  tail -n +2|awk -F '[:= ]' '{ print $4 }' | sort -u) <(kubectl get pods -o wide)

代码语言:javascript
复制
grep -f <(kubectl exec -it redis -- redis-cli -a <redis-auth> client list | tail -n +2|awk -F '[:= ]' '{ print $4 }' | sort -u) <(kubectl get pods -o wide)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59514326

复制
相关文章

相似问题

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