Я думаю, ваш код может быть существенно упрощен.Попробуйте это:
kubectl get nodes |
# Awk can do everything grep can do, and then some
awk 'toupper($0) ~ /DISABLED/ { print $1 }' |
# loop over results
while read -r node; do
kubectl describe node "$node" |
grep -q "string1" || echo "$node"
done
Если вывод kubectl describe node
где-то содержит имя узла (скажем, первое поле?), Тогда цикл while
может быть заменен чем-то вроде
# xargs already knows how to run a command
xargs -n 1 kubectl describe node |
# Simply filter out anything with string1
awk '! /string1/ { print $1 }'
Если вы хотите отсеять дубликаты, нажмите | sort -u
или в последнем случае реализуйте простое удаление дубликатов в скрипте Awk (подсказка: сохраняйте ассоциативные массивы значений, которые вы видели, и печатайте только тогда, когда что-то не так ')t уже в массиве).
Обновлено в ответ на редактирование: Вот попытка Awk, которая извлекает и печатает поле Name: если ни один из выходных данных не содержит start1
.
kubectl get nodes |
awk 'toupper($0) ~ /DISABLED/ { print $1 }' |
xargs -n 1 kubectl describe node |
awk '/^Name: / { if (NR>1 && name) print name
name=$2 }
/string1/ { name="" }
END { if (name) print name }'
Сценарий Awk назначит name
, когда увидит начало нового вывода.Если был установлен предыдущий name
, то сначала мы его печатаем (предыдущая запись).Второе регулярное выражение сбрасывает name
, если оно видит string1
, так что оно не будет напечатано, когда мы достигнем следующей записи.Наконец, в END
мы ловим фамилию, если она была установлена.