표준 입력의 각 줄 앞에 문자열을 추가합니다.

표준 입력의 각 줄 앞에 문자열을 추가합니다.

모든 Kubernetes 포드의 로그를 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;

내가 원하는 것은 다음과 같이 로그 앞에 포드 이름을 추가하는 것입니다.

#!/usr/bin/env bash

# ...

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

wait

제가 하려는 것이 무엇인지 아시리라 생각합니다. 로그를 해석하는 Bunyan이라는 프로그램을 통해 로그를 스트리밍하고 있으며, 그런 다음 각 줄 앞에 포드 이름($j)을 추가하고 싶습니다. 그러나 위의 진술은 정확할 수 없습니다. 평범한 오래된 bash로 이것을 할 수 있는 방법이 있나요?

$stdin은 stdin 행을 나타내는 더미 변수일 뿐이며 실제로 여기에는 존재하지 않습니다.

답변1

한 가지 옵션은 다음과 같습니다 awk.

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

예제를 실행하세요:

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

또 다른 옵션은 다음과 같습니다 sed.

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

sed가 명령의 내용을 구체적으로 해석하므로 슬래시나 &in을 피하도록 주의합니다. 매개변수 확장 시 검색 및 교체를 수행하기 위해 bash-ism을 사용하고 있습니다. 두 개의 슬래시는 "일치하는 모든 항목 바꾸기"를 의미하고 이중 슬래시는 대체된 텍스트에 백슬래시를 생성한다는 의미입니다.js//\\

답변2

이것은 나에게 효과적입니다.

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

하지만 한 가지 문제는 많은 도움이 되는 터미널 스타일을 잃어버렸다는 것입니다. 제어 문자 등을 보존하는 방법을 아는 사람이 있습니까?

관련 정보