我正试图用一句话来完成以下工作:
<command> | xargs -I {} grep {} <(other command)>我有一个Kubernetes集群,它运行Redis和许多其他应用程序。我想知道哪些应用程序(在本例中为pods)连接到Redis。
这可以分两步进行。
我使用以下命令获得了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我还可以使用以下命令获取吊舱名称:
$ 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我怎样才能在一条线上完成这件事。另外,我知道我可以给每个连接到Redis的客户端提供一个name,但是它需要更改应用程序代码,而我现在不能这样做。
编辑:
我给出的一行代码实际上部分工作,因为它只执行第一个grep ...,而不是所有grep ...命令。有人能解释我在这里做错了什么吗?
Edit2:
我认为只有第一个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>发布于 2019-12-28 21:38:26
你能试试这个吗?
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)发布于 2019-12-28 22:45:51
试着简单地:
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)或相同:
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简化
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)但您可以在事件中这样写:
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
)可以用两行重写:
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)或
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)https://stackoverflow.com/questions/59514326
复制相似问题