
次のように複数のファイルを一度に追いつくときに、各行の先頭にファイル名を表示する方法はありますか?
tail -f one.log two.log
電流出力
==> one.log <==
contents of one.log here...
contents of one.log here...
==> two.log <==
contents of one.log here...
contents of two.log here..
似たようなものを探しています。
one.log: contents of one.log here...
one.log: contents of one.log here...
two.log: contents of two.log here...
two.log: contents of two.log here...
答え1
短い答え
GNUパラレルこれを簡単に実行できる優れたオプションセットがあります。
parallel --tagstring "{}:" --line-buffer tail -f {} ::: one.log two.log
出力は次のとおりです。
one.log:one.logの内容はここにあります... one.log:one.logの内容はここにあります... Two.log:two.logの内容は次のとおりです。 Two.log:two.logの内容は次のとおりです。
追加の説明
- このオプションは、
--tagstring=str
各出力行を文字列として表示します。ステル。 ~からparallel
マニュアルページ:
--タグ文字列 文字列で行を表示します。各出力ラインの前に strとTAB(\ t)。 str には {} などの代替文字列を含めることができます。 -u、--onall、--nonall を使用する場合、--tagstring は無視されます。
すべての項目は
{}
並列引数に置き換えられます。この場合、ログファイル名はone.log
およびtwo.log
(後のすべての引数:::
)です。--line-buffer
コマンドが完了すると、コマンドの出力(または)が印刷されるため、このオプションが必要です。ファイルが大きくなるのを待つので、出力を1行ずつ印刷する必要があります。再びtail -f one.log
tail -f two.log
tail -f
--line-buffer
parallel
マニュアルページ:
--line-buffer(アルファテスト) ラインベースのバッファリングされた出力。 --groupは出力を保存します すべてのことを一緒にしてください。 --ungroup は出力の混合を許可します。 ラインの半分は職業から出て、ラインの半分は職業から出てきます。 他の職業。 --line-bufferは両方に適しています:GNU Parallel 行全体を印刷しますが、混合行を許可します。 他の職業。
答え2
tail -f ...your-files |
awk '/^==> / {a=substr($0, 5, length-8); next}
{print a":"$0}'
\ありがとう{don_cristti}
答え3
tail
必須でない場合は、grep
以下を使用して実行できます。
grep "" *.log
これにより、ファイル名が各出力行のプレフィックスとして印刷されます。
*.log
1つのファイルにのみ拡張すると、出力が中断されます。これに関して:
grep '' /dev/null *.log
答え4
私の考えは、誰かが提案したように、複数のファイルのマージログを含む単一のファイルを作成することです。ここファイル名を追加します。
$ tail -f /var/log/syslog | sed -u -E 's,(^.+$),/var/log/syslog: \1,g' >> /tmp/LOG &&
$ tail -f /var/log/Xorg.0.log | sed -u -E 's,(^.+$),/var/log/Xorg.0.log: \1,g' >> /tmp/LOG &&
$ tail -f /tmp/LOG