標準入力の各行の前に文字列を追加します。

標準入力の各行の前に文字列を追加します。

すべての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

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を使用しています。 2つのスラッシュは「一致するすべての項目を置き換える」を意味し、二重スラッシュは置き換えられたテキストにバックスラッシュを生成することを意味します。js//\\

答え2

これは私にとって効果的です。

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

しかし、一つの問題は、多くの役に立つターミナルスタイルを失ったことです。制御文字などを保存する方法を知っている人はいますか?

関連情報