Prefira string antes de cada linha de stdin

0

Eu tenho este script que envia logs de cada pod do Kubernetes para a stdout:

#!/usr/bin/env bash

set -e;

oc project cdt-dev

pods=$(oc get pods --show-all=false -o name)

for j in ${pods}; do
    oc logs -f "$j" | bunyan -o short -l error &
done

wait;

o que eu quero fazer é prefixar os logs com o nome do pod, algo assim:

#!/usr/bin/env bash

# ...

for j in ${pods}; do
    oc logs -f "$j" | bunyan -o short -l error |  echo "$j => $stdin" &
done

wait

Acho que você pode ver o que estou tentando fazer, canalizar os logs por meio de um programa chamado bunyan que interpreta os logs e, em seguida, quero preceder o nome do pod ($ j) em cada linha. Mas o acima não pode estar certo. Existe uma maneira de fazer isso com o bash simples?

Note que $ stdin é apenas uma variável dummy representando uma única linha de stdin, que realmente não existe aqui tmk.

    
por Alexander Mills 12.04.2018 / 14:38

2 respostas

2

Uma opção é awk :

for j in ...; do
  oc ... | bunyan --color ... | awk -v node="$j" '{print node " " $0}'
done

Um exemplo executado:

$ for j in node1 node2 node3
> do
> echo stuff | awk -v node="$j" '{print node " " $0}'
> done
node1 stuff
node2 stuff
node3 stuff

Outra opção é sed :

for j in node1 node2 node3; do
  j=${j////\/}
  j=${j//&/\&}
  oc ... | bunyan --color ... | sed "s/^/$j /"
done

Temos o cuidado de evitar qualquer barra invertida ou & em j , pois o sed interpreta os especialmente em s// de comandos. Eu usei um bash-ism lá para fazer pesquisa e substituição na expansão de parâmetro. As duas barras da frente significam "substituir todas as correspondências" e a% \ duplicada está lá para resultar em uma única barra invertida no texto substituído.

    
por 12.04.2018 / 14:55
0

Isso funciona para mim:

oc logs -f "$j" | bunyan -o short -l error  | while read line; do echo "$j $line"; done &

mas um problema é que perco o estilo do terminal, o que foi útil. Alguém sabe como manter chars de controle, etc?

    
por 12.04.2018 / 14:56