tailコマンドで各行にサフィックスまたはプレフィックスを追加する方法

tailコマンドで各行にサフィックスまたはプレフィックスを追加する方法

以下のようにtailコマンドを実行するファイルがあります。

tail -n+1 -F "./log/catalina.log"

このファイルの各行に、ファイル名自体である可能性がある別の文字列をサフィックスまたはプレフィックスとして追加して、ファイルの内容が次のようになるようにしたいと思います。

INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/9.0.1
INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Sep 27 2017 17:31:52 UTC
INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         9.0.1.0
INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux

出力は次のようになります。

Cataline.log INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/9.0.1
Cataline.log INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Sep 27 2017 17:31:52 UTC
Cataline.log INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         9.0.1.0
Cataline.log INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux

ベストアンサー1

パイプのもう一方の端からファイル名を取得するには、次のように-vオプションを使用tailして常にヘッダーを印刷できます。

$ tail -v file
==> file <==
test1
test2

最初の行をキャプチャしてプレフィックスを付けることができます。

$ tail -vf file | awk 'NR==1{f=$2;next} {print f,$0}'
file test1
file test2

上記のコマンドでは、ファイル名にスペースを含めないでください。この状況を扱うより良いバージョンは次のとおりです。

tail -vf file | awk 'NR==1{f=substr($0,5,length-8);next} {print f,$0}'

または、カスタムプレフィックスを使用します。

tail -vf file | awk 'BEGIN{p="custom prefix"} {print p,$0}'

カスタムサフィックスに似ています。

tail -vf file | awk 'BEGIN{s="custom suffix"} {print $0,s}'

おすすめ記事