プログラムが標準出力に出力するすべての新しい行の前にテキストを置きます


9

だから私はいくつかのロギングをしたいので、bashスクリプトの出力の前に日付を入れたいです。問題は、複数行の出力があることです。出力全体の前に日付を置くことしかできません。しかし、ログに日付のない行があります。もちろん、上の行の日付は同じであると想定できますが、解決策があることを望んでいました。前もって感謝します!

これは別のスクリプトを呼び出す私のスクリプトです。

#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended

これは出力です:

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
second line of output
2012-07-26 15:35:17 : script ended

そしてそれが私が欲しいものです:

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
2012-07-26 15:35:15 : second line of output
2012-07-26 15:35:17 : script ended

2番目のスクリプトを変更するだけでいいのではないでしょうか。
jmetz

いや、残念ながらそうではない。それが私がここに来た理由です。
tzippy 2012

回答:



3

これにはawkを使用できると思います。

./script.sh | awk '{ print strftime()" : "$0; }'

(strftime()によって返される日付のフォーマットについては、http: //www.gnu.org/software/gawk/manual/html_node/Time-Functions.htmlを参照してください


2
awk: calling undefined function strftime-これは固有gawkですか?
ダニエルベック

あなたがそれを述べた今、そうです:/
Flinth

2

使用できます awk

./script.sh | awk '{ print d,$1}' "d=$(date "+%F %T")"

awk入力ストリームを受け取り、その出力を変更します。このスクリプトは「print dの後に元の出力が続く」と言っdてから、日付を入力します。


1
これもdate式を一度だけ評価して、そのような行がすべて同時に印刷されるようにしないのですか?
ダニエルベック

@DanielBeckはい、あります。毎回日付を取得していると想定していましたが、テストをすぐに終了しました
Paul

1

これにより、次の出力の各行の前に現在の日付と時刻が出力されます./script.sh

set -f
./script.sh | while read -r LINE; do echo $(date "+%F %T") : "$LINE"; done
set +f

使い方

  • set -fbash展開をオフにします(またはecho *実際のアスタリスクを出力しません)。

  • while read -r LINE; do ... done出力の1行を変数に保存し、すべての行が処理されるまで$LINEを実行し...ます。

  • echo $(date "+%F%T"): "$ LINE"は、現在の時刻と日付で行を出力します。

  • set +f bash展開をオンに戻すので、bashスクリプトの残りの部分に干渉しません。


これは1回だけ評価されるためsed、2番目のスクリプトを開始する直前から、すべてが同じ日付を挿入します。ユーザーが望んでいるものではない可能性があります...
ダニエルベック

この試みもうまくいくとは思いません。私の知る限り、サブシェル全体が最初に完全に評価され、その後ループがトラバースされます。だから今は実行からです。
ダニエルベック

の実行ではなく、出力を遅延させるだけなので、この例は機能しませんls。次のコードでスクリプトを試してくださいscript.sh#!/bin/bash(改行)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
ダニエルベック

forループの代わりにループで使用readwhileます。
chepner

@chepner:いい考えですね。
デニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.