tailはファイルの最終行から数行を表示するコマンドだ。
標準では10行を表示する。
同じような機能のheadコマンドと同じようにインデックスを作成するのに便利である。
後で詳しく説明するがtailにはそれ以上に便利なオプションも用意されている。
tailコマンドの基本
コマンドの基本動作
使い方は、次のとおりだ。
$ tailファイル名
/etc/sensors3.confの最終行から数行を表示するには次のコマンドだ。
$ tail /etc/sensors3.conf
/etc/sensors3.confの最終行から数行が表示された。
ファイルの複数指定
ファイル名は複数指定でき、半角空白でつなげることができる。
例えば、/etc/passwdと/etc/groupの両方を出力したい時は次のコマンドだ。
$ tail /etc/passwd /etc/group
また、ファイル名にワイルドカードを利用することもできる。
拡張子がPHPのファイルすべてを対象とする場合は、次のコマンドだ。
$ tail *.php
拡張子がPHPのファイルすべての最終行数行が順次表示された。
複数のファイルを出力した場合は、各出力の前にファイル名が表示される。
tailコマンドのオプションたち
コマンドの一覧
後から詳細をご紹介するが、まずは一覧で見てみよう。
オプション -c(オプション--bytes=[-]K)
出力する文字数を指定する
オプション -n(オプション--lines=[-]K)
出力する行数を指定する
オプション -q(オプション--quiet, オプション--silent)
ファイル名を表示しない
オプション -v(オプション--verbose)
ファイル名を常に表示する
オプション -f(オプション--follow[={name|descriptor}])
ファイルの追記を監視する
詳細を解説する。
-cオプション(オプション--bytes=BYTE):出力する文字数を指定する
指定が無ければ最終行から10行を表示するが、-cオプションでは指定した文字数を出力する。
文字数はバイト単位だ。
文字数にKを付ければ、キロバイトを指定することもできる。
半角で数えた文字数なので、全角文字と半角カタカナと一般的ではない半角記号は指定したい文字数の倍を指定する。
書式は次のとおりだ。
$ tail -c 文字数 ファイル名
ファイルflag.phpの最終行10文字を表示する場合は、次のコマンドだ。
$ tail -c 10 flag.php
ファイルflag.phpの最終行10文字が表示された。
改行も1文字として数えられている。
この場合、出力文字の最後の改行が挿入されないので、ファイル内容に続いて同じ行にコマンドプロンプトが表示される。
文字数の前に-をつけると、最終文字から指定した文字数を表示する
$ tail -c -文字数 ファイル名
ファイルflag.phpの最終文字から20文字を表示する場合は、次のコマンドだ。
$ tail -c -20 flag.php
ファイルflag.phpの最終文字から20文字が表示された。
-nオプション(オプション--lines=[-]K):出力する行数を指定する
指定が無ければ最終行から10行を表示するが、-nオプションでは指定した行数を出力する。
書式は次のとおりだ。
$ tail -n 行数 ファイル名
ファイルflag.phpの最終行2行を表示する場合は、次のコマンドだ。
$ tail -n 2 flag.php
ファイルflag.phpの最終行2行が表示された。
headコマンドの場合は、行指定だと最後の改行が表示され、コマンドプロンプトは次の行から始まるが、tailコマンドの場合は、最後の改行が表示されないので、コマンドプロンプトの直前までファイル内容が表示される。
行数の前に-をつけると、最終行から指定した行数以外を表示する
$ tail -n -行数 ファイル名
ファイルflag.phpの最終行から2行以外を表示する場合は、次のコマンドだ。
$ tail -n -2 flag.php
ファイルflag.phpの最終行から2行以外が表示された。
-qオプション(--quietオプション, --silentオプション):ファイル名を表示しない
複数ファイルを指定した場合に表示される各ファイル名を表示しない。
書式は次のとおりだ。
$ tail -q ファイル名
拡張子がPHPのファイルすべてのファイルの最終行数行を、ファイル名を表示せずに、連続して表示する場合は次のコマンドだ。
$ tail -q *.php
拡張子がPHPのファイルすべてのファイルの最終行数行が、対象が複数でありながらファイル名を表示せずに、表示された。
-vオプション(--verboseオプション): ファイル名を常に表示する
tailコマンドで、単一のファイルの最終行数行を表示する場合、ファイル名は表示しない。
どんな場合でも常にファイル名を表示する書式は次のとおりだ。
$ tail -vファイル名
ファイルflag.datの最終行から数行を表示し、ファイル名も同時に表示する場合は、次のコマンドだ。
$ tail -v flag.dat
最終行から数行を表示し、対象がファイルflag.datの1ファイルでありながらファイル名も同時に表示された。
-fオプション(--follow[={name|descriptor}]オプション):ファイルの追記を監視する
ファイルの追記を監視するため、待機する。
追記があった場合は、追記の分を表示する。
書式は次のとおりだ。
$ tail -fファイル名
ファイルdata.datへの追記を監視するには次のコマンドだ。
$ tail -f data.dat
待機状態となるために、コマンドプロンプトは表示しない。
-fオプションは状況によって様々な動作をする。
それぞれ紹介していく。
変更前と変更後でファイルサイズが変更しなかった場合
注意したいのは、ファイルサイズに変更がなければ、何も表示しない。
例えば、ファイルdata.datに「123」のみが記載されていたとしよう。
ファイルdata.datを「100」に上書きしても、なにも反応しない。
文字数、つまりファイル容量が変わらない限り、反応はない。
追記が変更前と同じ行だった場合
同じ行に追記した場合は、その行は一旦削除され、新たに追加分を含んだ文字列が追記されたことになる。
例えば、ファイルdata.datに「abc」のみが記載されていたとしよう。
ファイルdata.datを「abc123」に上書きすると、「abc」を削除して「abc123」を追記したという表示になる。
文字の量が減り、ファイルサイズが小さくなった場合
追記に対しての動作だけではなく、削除に対してもきちんと反応する。
例えば、ファイルdata.datに「x=y*1+0.5」と記載されていたとしよう。
ファイルdata.datを「x=y*1+1」に上書きすると、「x=y*1+0.5」を削除して「x=y*1+1」を追記したという表示になる。
「x=y*1+1」も削除すると、追記はないので、削除のメッセージだけとなる。
この使い方での動作終了時は、Ctrl+Cのショートカットキーで終了する。
また、動作中はプロセスとして動作しているので、psコマンドの-aオプションでプロセス番号(PID)を確認後、killコマンドでも動作を終了できる。
特殊な使い方
ファイル名を指定しないか「-」と指定しコマンドを実行すると、何も出力しない。
headコマンドでは、キーボードから入力した文字をそのままオウム返しのように繰り替えして表示したが、tailコマンドでは、反応がないため、キーボードから入力したもののみが表示されている。
関連コマンド
最後にtailコマンドに関連して、基本的なファイルの表示コマンドも紹介しておく
catコマンド
ファイル内容を表示する。
headコマンド
ファイルの先頭行数行を表示する。
viコマンド
ファイル内容を編集する。
まとめ
先にも書いたが、ファイルの内容を含んだインデックスを作るのに非常に有用なコマンドだ。
例えば、プログラムソースを作成していて、各ファイルのはじめ3行には必ずどんなファイルか記すというルールを徹底しておけば、このコマンドで様々なインクルードファイルなどをインデックスし、見やすくまとめることができる。
lsコマンド、grepコマンドと使い分けながら、活用していこう。
●重複
/etc/sensors3.confの最終行から数行を表示するには次のコマンドだ。
$ tail /etc/sensors3.conf
●headコマンド
ファイルの最終行数行を表示する。 「最終行数行」⇒「先頭行数行」
ご指摘いただき誠にありがとうございます。
記事、該当箇所修正いたしました。
引き続きご愛読の程、よろしくお願いいたします。