- 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の哲学に沿った従来のユーティリティの居場所はまだあります。
コメントする