Как вывести результат цепочки команд для заданного ввода с bash - PullRequest
0 голосов
/ 14 февраля 2020

Что касается этого вопроса Я все еще пытаюсь сработать следующий однострочный

kubectl get ns | while read -r line; do  echo `$line | grep Term | cut -d' ' -f1`; done

Я бы ожидал распечатать результат $line | grep Term | cut -d' ' -f1, однако он выводит пустая строка (echo), а затем выполняет результат $line | grep Term | cut -d' ' -f1

bash: NAME: command not found

bash: cert-manager: command not found

bash: configmap-4262: command not found

bash: configmap-4430: command not found

Те же результаты с немного другим подходом:

kubectl get ns | while read -r line; do ns=`$line | grep Term | cut -d' ' -f1`; echo $ns; done

Чего я на самом деле хочу достичь, так это используйте результат $line | grep Term | cut -d' в качестве ввода сценария оболочки, например

do ns=`$line | grep Term | cut -d' ' -f1`; ./delete-kube-ns.sh $ns;

или

$line | grep Term | cut -d' ' -f1` | xargs ./delete-kube-ns.sh

Ответы [ 4 ]

3 голосов
/ 14 февраля 2020

Ger избавиться от спины. Он пытается выполнить вывод kubectl в качестве команды оболочки. Вы хотите повторить $line, а не результат его выполнения в качестве команды.

kubectl get ns | while read -r line; do  
    echo "$line" | grep Term | cut -d' ' -f1
done

На самом деле, кажется, вообще нет необходимости использовать while read, просто труба kubectl до grep

kubectl get ns | grep Term | cut -d' ' -f1
1 голос
/ 15 февраля 2020

Любая комбинация из grep и cuthead, tall, et c, а также sed) предполагает повторную реализацию в Awk. Сохранение одного внешнего процесса - это небольшая оптимизация, но часто это требует дополнительных простых улучшений. Например, должно ли регулярное выражение охватывать всю строку или оно действительно должно искать совпадения в первом поле? Это не невозможно с grep, конечно же, но довольно легко в Awk.

kubectl get ns |
awk '/Term/ { print $1 }'

Если вы только хотели найти Term в первом поле, это '$1 ~ /Term/ { ...

Вы можете расширить это с помощью трубы до

... | xargs ./delete-kube-ns.sh

, если это ваша конечная цель.

1 голос
/ 15 февраля 2020

A parameter expansion может быть тем, что вы хотите / нужно, вместо встраивания grep и cut в while read l oop.

#!/usr/bin/env bash

kubectl get ns | while IFS= read -r line; do  
  [[ $line == Term ]] && ns=${line% *}
  echo "$ns"
done

В зависимости от соответствия шаблона, вам может понадобиться *Term*

0 голосов
/ 19 февраля 2020

С вашим предложением я действительно смог достичь того, что намеревался сделать

kubectl get ns | awk '/Term/ { print $1 }' | while IFS= read -r line; do
   ~/bin/kill-kube-ns.sh $line
done
Killed namespace: configmap-4500
Killed namespace: configmap-5062
Killed namespace: configmap-5526
Killed namespace: configmap-5817
Killed namespace: configmap-6143
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...