複数のファイルを一度にテーリングする場合、各行の先頭にファイル名を表示しますか?


14

以下に示すように複数のファイルを一度にテーリングする場合、各行の先頭にファイル名を表示する方法はありますか?

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...

-vtailの(詳細)オプションを見ることができます。これはあなたの要求と正確に一致しないかもしれませんが、開始です。
ラーウル

マルチテールはこれを行うことができます
ジル「SO-悪であるのをやめる」

回答:


7
tail  -f ...your-files | 
    awk '/^==> / {a=substr($0, 5, length-8); next}
                 {print a":"$0}'

\ thanks {don_cristti}


@don_crissti、ありがとう!(1)vsファイル-もうグラスにワインはありません!(2)良いアイデア。私はこのようなことを始めますが、「だれもスペースを含むファイルのtail -fを作成することはありません」と自己主張しました:)-あなたの素晴らしい提案を使用します。
JJoao

長さ-8を説明できますか?ここで8である理由、私は8作品だけを知っています。
石城郭

1
tail -n 1 * .txt | awk '/ ^ ==> / {a = substr($ 0、5、length-8); next} {print a、$ 1} '| awk '$ 2> 0 {if($ 2!〜/ chrY /)print $ 1}' | xargs -I {} qsub {}
Shicheng Guo

@ ShichengGuo、8 = length( "==>")+ length( "<==")
JJoao

1
驚くほど/驚くほどあなたのjoojoo魔法のawkソリューションは機能します!
トレバーボイドスミス

6

短い答え

GNU Parallelには、このようなことを本当に簡単に行える一連の素晴らしいオプションがあります。

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各出力行に文字列strをタグ付けしますparallel manページから:
--tagstring str
                行に文字列をタグ付けします。各出力行の前に
                strおよびTAB(\ t)。strには、{}などの置換文字列を含めることができます。

                -u、-onall、および--nonallを使用する場合、-tagstringは無視されます。
  • のすべての出現は{}、この場合はログファイル名であるパラレルの引数に置き換えられます。すなわちone.logand two.log(すべての後の引数:::)。

  • コマンドが終了するとコマンド--line-bufferの出力(tail -f one.logまたはtail -f two.log)が出力されるため、オプションが必要です。以来tail -f、ファイルの成長を待ちます、ライン単位で出力印刷するように要求され--line-bufferそうに。再びparallel manページから:

--line-buffer(アルファテスト)
                行単位でのバッファ出力。--groupは出力を保持します
                全体の仕事のために一緒に。--ungroupは、出力との混同を許可します
                1つのジョブからの半分の行と1つのジョブからの半分の行
                他の職。--line-bufferは、これら2つの間に適合します。GNUパラレル
                行全体を印刷しますが、次の行を混在させることができます
                さまざまな仕事。

2

tail必須ではない場合、grepこれを実現するために使用できます。

grep "" *.log

これにより、各出力行のプレフィックスとしてファイル名が出力されます。

*.log1つのファイルのみに展開すると、出力が中断します。この点について:

grep '' /dev/null *.log

tail -fnotの出力にファイル名を表示する必要がありますgrep
mtk

@serenesatこれはファイルの内容全体を印刷するだけですよね?OPは、末尾が指定されているときにファイル名を印刷するように求めていました
-rahul

あなたはまた、単に行うことができます--with-filename-H、常にファイル名の先頭に追加を強制します。
トレバーボイドスミス

私は本当にこの答えが大好きです!13文字の長さのソリューションで必要なことを正確に実行します。トリッキーなawkソリューションparallelとは対照的に、またはインストールされていません。
トレバーボイドスミス

唯一の問題は、ログファイルの長さが100万行である場合です。その後、あなたのgrepが...(またはSSHを介して)を慰めるために100万行をスパムします
トレバー・ボイド・スミス

0

私のアイデアは、いくつかのファイルからマージされたログを含む単一のファイルを作成することです

$ 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

0

何かxargssed仕事ができます:

$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT
one.log
two.log
EOT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.