使用 grep 和 awk 进行多模式搜索在多行匹配中不起作用

使用 grep 和 awk 进行多模式搜索在多行匹配中不起作用

我必须在给定的输出中查找两个字符串。查找必须是 AND 而不是 OR。我只想列出每次迭代中给定输出中包含字符串“mlm”和“dgx”的行。

假设我的输出低于输出 10 次,但其中只有少数同时具有这两个字符串,那么我只想打印那些在该迭代的输出中同时存在这两个字符串的少数。

所以,我读了这篇文章,但没有运气.. 如何使用多个 and 模式运行 grep

我的尝试:

kubectl get nodes -l nodeGroup=gpu -o wide --no-headers | sed -n -e 1,1p | xargs -l1 -- sh -c 'kubectl get pods --all-namespaces -o wide --field-selector=spec.nodeName=$1,status.phase=Running' -- | awk '{print $1,$2}'

输出1


kube-system nginx-proxy-mlmpx100k8s0223p
kube-system nginx-proxy-zlmpx100k8s0223p
team1-92a20add-8857-4e94-a8b6-628db4a65e5e nominal-rigs-e2e-a1xpa-gpu-pool-62b857e3-153-5b58d86c6d-tt67w
team2-92a20add-8857-4e94-a8b6-628db4a65e5e nominal-rigs-e2e-a1xpa-gpu-pool-62b857e3-153-5b58d86c6d-tt67w

kubectl get nodes -l nodeGroup=gpu -o wide --no-headers |  sed -n -e 1,1p | xargs -l1 -- sh -c 'kubectl get pods --all-namespaces -o wide --field-selector=spec.nodeName=$1,status.phase=Running' -- | awk '{print $1,$2}' | awk '/mlm/ && /team1/'

输出2

nothing prints

预期输出:

kube-system nginx-proxy-mlmpx100k8s0223p
team1-92a20add-8857-4e94-a8b6-628db4a65e5e nominal-rigs-e2e-a1xpa-gpu-pool-62b857e3-153-5b58d86c6d-tt67w

答案1

以下方法假设每次调用kubectl都会给出一个输出块,如果两个字符串都出现,您希望打印该输出块,或者如果仅出现一个字符串或没有出现,则完全丢弃该输出块。最好将其封装在 shell 脚本中。

假设bash,你可以尝试:

#!/bin/bash

OUTPUT=$(kubectl get nodes -l nodeGroup=gpu -o wide --no-headers)

SEARCHRES=0

grep "mlm" <<< "$OUTPUT" > /dev/null
SEARCHRES=$((SEARCHRES+$?))

grep "team1" <<< "$OUTPUT" > /dev/null
SEARCHRES=$((SEARCHRES+$?))

if (( SEARCHRES == 0 )); then echo "$OUTPUT"; fi

如果您有不同类型的 shell,则需要执行一些语法调整:

#!/bin/<whatever sh>

OUTPUT=$(kubectl get nodes -l nodeGroup=gpu -o wide --no-headers)

SEARCHRES=0

echo "$OUTPUT" | grep "mlm" > /dev/null
let SEARCHRES=$SEARCHRES+$?

echo "$OUTPUT" | grep "team1" > /dev/null
let SEARCHRES=$SEARCHRES+$?

if [ "$SEARCHRES" == "0" ]; then echo "$OUTPUT"; fi

kubectl两种方法都会在 shell 变量中缓冲调用的完整输出。然后,他们检查这两种模式是否出现在输出中的任何位置:因为如果选择了任何行,grep则返回代码 ( $?) 为 0,因此检查两个调用的总和grep是否为零将确保两种模式都存在。只有这样我们才能打印整个输出。

请注意,可以简化这个进入

#!/bin/bash

OUTPUT=$(kubectl get nodes -l nodeGroup=gpu -o wide --no-headers)

grep -q "mlm" <<< "$OUTPUT" && grep -q "team1" <<< "$OUTPUT" && echo "$OUTPUT"

由于&&只有前一个命令的结果代码为 0 时,链式命令才会执行。

相关内容