我有以下bash命令:
oc get pods -o wide \
| grep -v asm \
| grep -v fnd \
| grep -v key \
| grep -v apiwg \
| grep -v cbkc \
| grep -v container \
| grep -v apigw \
| grep -v apacheds \
| grep -v couchbase-service \
| grep -v catalogone-tool-job \
| grep -v connector \
| grep -v operator \
| grep -v broker \
| grep -v logicaldate \
| grep -v oc-audit \
| grep -v oc-cb-01-000 \
| grep -v light-tracer \
| grep -v rule-engine \
| awk '{print $1}' \
| grep -v NAME \
| xargs oc delete pod --force --grace-period=0我试图为每一个吊舱删除(xargs oc delete pod)触发一个睡眠定时器,我的选择是什么?
发布于 2021-08-17 12:43:56
我不认为xargs是适当的工具,如果你想一个一个地删除。xargs被设计成分批处理参数。如果一个一个地执行oc delete pod ...是可以接受的,您可以传递-n 1,但是您也可以使用for循环。最重要的是,您有那么多不必要的调用grep。我会这样做:
declare -a PODS=$(
oc get pods -o wide | grep -v \
-e asm \
-e fnd \
-e key \
-e apiwg \
-e cbkc \
-e container \
-e apigw \
-e apacheds \
-e couchbase-service \
-e catalogone-tool-job \
-e connector \
-e operator \
-e broker \
-e logicaldate \
-e oc-audit \
-e oc-cb-01-000 \
-e light-tracer \
-e rule-engine | awk '{print $1}' | grep -v NAME
)
for i in "${PODS[@]}"; do
oc delete pod --force --grace-period=0 "$i"
sleep 10
done编辑:,因为OP要求它是一个命令;您可以将PODS数组替换为顶部的命令,如下所示:
for i in "$(oc get pods -o wide | ... )"; do
oc delete pod --force --grace-period=0 "$i";
sleep 10;
done您也可以交互地使用for循环,没有限制,只需添加分号来表示命令的结尾,并在一行中键入所有内容。注意引用的子subshell:"$(...)"。如果容器的名称中有空格(感谢@RenaudPacalet的改进),保持这一点非常重要。
发布于 2021-08-17 12:31:40
您可以在传递给xargs的命令中添加睡眠,例如,将其包装在sh -c ...中。
顺便说一句,这是一条可怕的输油管。您可以将grep -v foo | grep -v bar重构为grep -v -e foo -e bar,也可以将字符串保存在文件中并使用grep -v -f filename;但是,让我们进一步将所有内容重构到一个Awk脚本中。另见useless use of grep.
oc get pods -o wide |
awk '!/asm|fnd|key|apiwg|cbkc|container|apigw|apacheds|couchbase-service|catalogone-tool-job|connector|operator|broker|logicaldate|oc-audit|oc-cb-01-000|light-tracer|rule-engine/ && $1 !~ /NAME/ {
print $1}' |
xargs sh -c 'for f; do
oc delete pod --force --grace-period=0 "$f"
sleep 1
done' _Awk脚本可能会被进一步重构,以数组的形式传入字符串,但这也取决于这些字符串的确切来源。听起来,也许您应该添加一个标记或其他东西,这样您就可以向oc get pods中添加一个参数,以便只针对您想要的对象。
发布于 2021-08-17 12:40:02
只需正常循环-没有理由使用xargs。以下是另一张照片:
exclude=(
asm
fnd
...
)
oc get pods -o wide |
grep -v -f <(printf "%s\n" "${exclude[@]}") |
awk '{print $1}' |
grep -v NAME |
while IFS= read -r f; do
oc delete pod --force --grace-period=0 "$f"
sleep 1
done当您将|放在行尾时,就不需要编写\了。
https://stackoverflow.com/questions/68817294
复制相似问题