stdoutに出力がある場合はstdoutの前に条件付きヘッダーを印刷する方法

stdoutに出力がある場合はstdoutの前に条件付きヘッダーを印刷する方法

ディレクトリ内のファイルのリストをフィルタリングするプロセスがあります(findキューが停止したことを示すために特定の期間より古いファイルがあることを確認してください)。何も返すことも、返さない場合もあり、返却すると郵便で渡されますcron

bashこの出力をパイプで接続するプログラムや簡単な方法があるかどうか疑問に思います。どのヘッダー行が先頭に追加され、それによって出力されます(たとえば、「キューに入れられたファイルです」)。

答え1

sedインライン回答:

find ./files -mtime +90|sed '1s/^/Files stuck in queue:\n/'

答え2

bash要求されるとおり、他のメソッドは実際にはメソッドを提供しないため、次のようになります。

command | while IFS= read -r line; do
    (( i )) || { printf '%s\n' 'These are the files stuck in the queue:' ; (( i++ )) ; }
    printf '%s\n' "${line}"
done

使用されるすべてのコマンドは内部コマンドですbash

出力ラインがなければ、何も印刷されません。存在する場合は、ヘッダー行が印刷され、その後に出力が表示されますcommand

答え3

入力ストリームの処理中に状態を維持したい場合は、awkが最高のツールであることがよくあります。

この場合、ストリームを処理しようとし、入力が表示されたらヘッダーを作成し、そのヘッダーを書き込んだという記録を作成します。

awk '!input_seen { print "header"; input_seen = 1 } 1'

変数がinput_seenfalseの場合(定義されていない場合はデフォルトはfalse)、ヘッダーを印刷してtrue(1)に設定します。最後に、1別のルールは簡単な方法です。現在の行を印刷します。1に変更することもできます{ print }

答え4

または、

output=$(command)
[[ -n $output ]] && { echo "header"; echo "$output"; }

関連情報