tailコマンドが便利だった件

##tailコマンドとは

tailはファイルの最終行から数行を表示するコマンドです。デフォルトでは10行表示します。
あるファイルをtailコマンドを使用して表示してみます。

```
[vagrant@local logs]$ ll
合計 148
-rwxrwxrwx 1 vagrant vagrant  2185 11月  4 02:16 cli-debug.log
-rwxrwxrwx 1 vagrant vagrant 72566 11月  4 02:15 cli-error.log
-rwxrwxrwx 1 vagrant vagrant 11205 11月  4 03:12 error.log
[vagrant@local logs]$ 
[vagrant@local logs]$ tail error.log 
)
Request URL: /inquires/inquires/index
Referer URL: http://local.profile/inquires/history
Stack Trace:
#0 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(114): Cake\Controller\Controller->invokeAction()
#1 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\InquiresController))
#2 /vagrant/sample.com/profile/webroot/index.php(36): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#3 {main}


[vagrant@local logs]$ 
```

このように最終行から10行表示されました。

また、tailコマンドの後ろにオプションを付ける事が出来ます。

| オプション名 | 意味 |
|:-:|:-:|
| -c  |出力する文字数を指定   |
| -n  |出力する行数を指定   |
| -q  |ファイル名を表示しない   |
| -v  |ファイル名を常に表示する   |
| -f  |出力を監視する   |

##オプション説明
###-cオプション

-cオプションは、`tail -c 100 ファイル名`とする事で最終行から100文字を出力します。

```
[vagrant@local logs]$ tail -c 100 error.log 
uting\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#3 {main}


[vagrant@local logs]$ 
```

###-nオプション

-nオプションは、`tail -n 5 ファイル名`とする事で最終行から5行表示します。

```
[vagrant@local logs]$ tail -n 5 error.log 
#1 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\InquiresController))
#2 /vagrant/sample.com/profile/webroot/index.php(36): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#3 {main}


[vagrant@local logs]$ 
```

###-qオプション

-qオプションは、ファイル指定によるコマンド実行以外で使用する際にファイル名を非表示にします。

例えば`tail -q error.log`←これを叩いても`tail error.log`の動きと全く変わりません。
logsディレクトリ配下の.log拡張子のファイルを開きたい時`tail *.log`とする事で、拡張子が`.log`のファイルを開きます。

```
[vagrant@local logs]$ tail *.log
==> cli-debug.log <==
2018-11-04 02:09:41 Debug: command 'whitespace' in plugin 'DebugKit' was not aliased, conflicts with 'DebugKit'
2018-11-04 02:09:41 Debug: command 'migrations' in plugin 'Migrations' was not aliased, conflicts with 'Migrations'

==> cli-error.log <==
#16 [internal function]: Migrations\Shell\MigrationsShell->main('migrations', 'rollback')
#17 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Console/Shell.php(455): call_user_func_array(Array, Array)



==> error.log <==
)
Request URL: /inquires/inquires/index
Referer URL: http://local.profile/inquires/history


[vagrant@local logs]$ 

```

この時どのファイルを開いているか示されていますよね。
これを非表示にするというのが`-qオプション`です。
`tail -q *.log`を叩きます。

```
[vagrant@local logs]$ tail -q *.log
2018-11-04 02:09:41 Debug: command 'whitespace' in plugin 'DebugKit' was not aliased, conflicts with 'DebugKit'
2018-11-04 02:09:41 Debug: command 'migrations' in plugin 'Migrations' was not aliased, conflicts with 'Migrations'
2018-11-04 02:12:43 Debug: command 'bake' in plugin 'Bake' was not aliased, conflicts with 'Bake'
2018-11-04 02:12:43 Debug: command 'benchmark' in plugin 'DebugKit' was not aliased, conflicts with 'DebugKit'
#16 [internal function]: Migrations\Shell\MigrationsShell->main('migrations', 'rollback')
#17 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Console/Shell.php(455): call_user_func_array(Array, Array)
#18 /vagrant/sample.com/profile/vendor/cakephp/migrations/src/Shell/MigrationsShell.php(156): Cake\Console\Shell->runCommand(Array, true, Array)


)
Request URL: /inquires/inquires/index
Referer URL: http://local.profile/inquires/history
Stack Trace:


[vagrant@local logs]$ 
```

###-vオプション

-vオプションは、ファイル名を常に表示するコマンドなので、ファイル指定してもファイル名を表示させます。
`tail -v ファイル名`を叩きます。

```
[vagrant@local logs]$ tail -v error.log 
==> error.log <==
)
Request URL: /inquires/inquires/index
Referer URL: http://local.profile/inquires/history
Stack Trace:
#0 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(114): Cake\Controller\Controller->invokeAction()
#1 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\InquiresController))
#2 /vagrant/sample.com/profile/webroot/index.php(36): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#3 {main}


[vagrant@local logs]$ 

```

###-fオプション

-fオプションは、`tail -f ファイル名`とする事で、そのファイルの最終行を監視します。

```
[vagrant@local logs]$ tail -f error.log 
)
Request URL: /inquires/inquires/index
Referer URL: http://local.profile/inquires/history
Stack Trace:
#0 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(114): Cake\Controller\Controller->invokeAction()
#1 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\InquiresController))
#2 /vagrant/sample.com/profile/webroot/index.php(36): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#3 {main}



```

最終行を表示したままにします。終了したいときは`Ctrl+C`で監視を終了します。


##何が便利なのか

ログを監視したい時にtailコマンドの`-fオプション`が非常に相性が良いです。
ログファイルを監視状態にしておく事でリアルタイムでログを確認できます。
これをデバックに使用する事もできる為、便利だと思ったのです。

まず`tail -f debug.log`でdebugファイルを監視します。

```
[vagrant@local logs]$ tail -f debug.log 



```

そしてどこかにdebugコードを仕込みます。
その後、debugコードを仕込んだ対象画面を更新します。
そうするとdebugした内容がリアルタイムで表示されます。

```
[vagrant@local logs]$ tail -f debug.log 


2018-11-21 09:57:08 Debug: 　ほげ
```

いちいちファイルを開く必要がない、というメリットも便利だと思った理由です。

もし試したことの無い方がいましたら一度いかがでしょうか？
Linuxコマンドと友達になると幸せになります！