Linuxでtailコマンドを使用する方法

  • Linuxのtailコマンドはファイルの末尾のデータを表示するため、ログファイルの監視と最近の追加の表示に便利です。
  • 一部のLinuxディストリビューションでsystemdが導入されたことで、システムログファイルの形式がバイナリ形式に変更されましたが、多くのアプリケーションで生成されたログファイルは依然としてプレーンテキスト形式を使用しています。
  • tailはリアルタイムに更新を表示できるほか、特定の数の行を表示したり、複数のファイルで作業したり、ファイルの先頭から行を表示したり、バイトオフセットを使用したり、パイプラインを介して他のコマンドと組み合わせたりすることもできます。

Linuxのtailコマンドは、ファイルの末尾のデータを表示します。ファイルに追加された更新をリアルタイムに表示することもできます。使用方法を紹介します。

systemdでtailが廃止された?

tailコマンドは、ファイルの末尾のデータを表示します。通常、新しいデータはファイルの末尾に追加されるため、tailコマンドはファイルへの最新の追加をすばやく簡単に確認する方法です。ファイルの監視と、ファイルへの新しいテキストエントリが発生したときにそのエントリをすべて表示することもできます。これにより、ログファイルを監視するのに最適なツールになります。

最近のLinuxディストリビューションの多くは、systemdシステムおよびサービスマネージャーを採用しています。これは最初に実行されるプロセスで、プロセスID 1を持ち、他のすべてのプロセスの親です。この役割は以前は古いinitシステムによって処理されていました。

この変更に伴い、システムログファイルの新しい形式が登場しました。systemdではプレーンテキストで作成されなくなり、バイナリ形式で記録されます。これらのログファイルを読み取るには、journactlユーティリティを使用する必要があります。tailコマンドはプレーンテキスト形式で動作します。バイナリファイルは読み取りません。つまり、tailコマンドは解決策を求める問題なのでしょうか?まだ何か提供するものがあるのでしょうか?

tailコマンドにはリアルタイムで更新を表示する以上の機能があります。また、システムで生成されたものではなく、プレーンテキストファイルとして作成されたままのログファイルも数多くあります。たとえば、アプリケーションによって生成されたログファイルの形式は変更されていません。

Linuxでtailを使用する

tailにファイル名を渡すと、そのファイルの最後の10行が表示されます。使用しているサンプルファイルには、並べ替えられた単語のリストが含まれています。各行には番号が付けられているため、例に従って、さまざまなオプションがどのような効果をもたらすかを確認するのは簡単です。

tail word-list.txt

異なる数の行を表示するには、-n(行数)オプションを使用します。

tail -n 15 word-list.txt

実際、"-n"を省略して、ハイフン「-」と数字だけを使用することもできます。間にスペースがないことを確認してください。技術的には、これは廃止されたコマンド形式ですが、マニュアルページに記載されており、依然として機能します。

tail -12 word-list.txt

複数のファイルでtailを使用する

tailを複数のファイルで同時に使用できます。コマンドラインにファイル名を渡すだけです。

tail -n 4 list-1.txt list-2.txt list-3.txt

各ファイルに小さなヘッダーが表示され、行がどのファイルに属しているかがわかります。

ファイルの先頭から行を表示する

+(先頭からのカウント)修飾子を使用すると、tailは特定の行番号から始まってファイルの先頭から行を表示します。ファイルが非常に長く、ファイルの先頭に近い行を選択した場合、ターミナルウィンドウに大量の出力が出力されます。その場合は、tailからの出力をlessにパイプするのが理にかなっています。

tail +440 list-1.txt

テキストを制御された方法でページングできます。

このファイルには20,445行があるため、このコマンドは「-6」オプションを使用するのと同じです。

tail +20440 list-1.txt

tailでバイトを使用する

-c(バイト)オプションを使用すると、tailにバイト単位でオフセットを使用するように指示できます。これは、通常のサイズのレコードにフォーマットされたテキストファイルがある場合に便利です。改行文字は1バイトとしてカウントされることに注意してください。このコマンドはファイルの最後の93バイトを表示します。

tail -c 93 list-2.txt

-c(バイト)オプションを+(ファイルの先頭からのカウント)修飾子と組み合わせ、ファイルの先頭からカウントされたバイト単位のオフセットを指定できます。

tail -c +351053 list-e.txt

tailへのパイプ処理

先ほど、tailからの出力をlessにパイプ処理しました。他のコマンドからの出力をtailにパイプ処理することもできます。

変更時間が最も古い5つのファイルまたはフォルダーを識別するには、ls-t(変更時間によるソート)オプションを使用し、その出力をtailにパイプ処理します。

ls -tl | tail -5

headコマンドは、ファイルの先頭からテキストの行をリストします。これをtailと組み合わせて、ファイルの一部を抽出することができます。ここでは、headコマンドを使用して、ファイルの先頭から200行を抽出しています。これはtailにパイプ処理され、最後の10行が抽出されます。これにより、191行目から200行目までの行が得られます。つまり、最初の200行の最後の10行です。

head -n 200 list-1.txt | tail -10

このコマンドは、メモリを最も多く消費している5つのプロセスをリストします。

ps aux | sort -nk +4 | tail -5

これを分解してみましょう。

psコマンドは、実行中のプロセスに関する情報を表示します。使用されるオプションは次のとおりです。

  • a: 現在のユーザーだけでなく、すべてのプロセスをリストします。
  • u: ユーザー指向の出力表示します。
  • x: TTY内で実行されていないプロセスを含め、すべてのプロセスをリストします。

sortコマンドは、psからの出力をソートします。sortで使用しているオプションは次のとおりです。

  • n: 数値でソートします。
  • k +4: 4番目の列でソートします。

tail -5コマンドは、ソートされた出力から最後の5つのプロセスを表示します。これらは、メモリを最も多く消費している5つのプロセスです。

tailを使用してファイルをリアルタイムで追跡する

ファイル(通常はログファイル)に到着する新しいテキストエントリを追跡するのは、tailを使用すると簡単です。コマンドラインでファイル名を渡し、-f(フォロー)オプションを使用します。

tail -f geek-1.log

新しいログエントリがログファイルに追加されるたびに、tailはターミナルウィンドウの表示を更新します。

特定の関連性または興味のある行のみを含めるように出力を絞り込むことができます。ここでは、grepを使用して「average」という単語を含む行のみを表示しています。

tail -f geek-1.log | grep average

2つ以上のファイルの変更を追跡するには、コマンドラインでファイル名を渡します。

tail -f -n 5 geek-1.log geek-2.log

各エントリには、テキストの元のファイルを示すヘッダーがタグ付けされています。

追跡対象のファイルに新しいエントリが到着するたびに、表示が更新されます。更新期間を指定するには、-s(スリープ期間)オプションを使用します。これは、tailにファイルのチェック間で一定の秒数(この例では5秒)待機するように指示します。

tail -f -s 5 geek-1.log

確かに、スクリーンショットを見るだけではわかりませんが、ファイルの更新は2秒に1回行われています。新しいファイルエントリは、ターミナルウィンドウに5秒に1回表示されています。

複数のファイルのテキストの追加を追跡している場合は、テキストの元のログファイルを識別するヘッダーを非表示にできます。これを行うには、-q(静的)オプションを使用します。

tail -f -q geek-1.log geek-2.log

ファイルからの出力は、テキストがシームレスにブレンドされて表示されます。各エントリがどのログファイルから来たかを示すものは何もありません。

tailは依然として価値がある

システムログファイルへのアクセスは現在journalctlによって提供されていますが、tailは依然として提供できるものがたくさんあります。これは特に、他のコマンドと組み合わせて使用し、tailに出力したり、tailから入力したりする場合に当てはまります。

systemdは状況を変えたかもしれませんが、1つのことをうまく行うというUnixの哲学に沿った従来のユーティリティの居場所はまだあります。