はじめに
実務でもよくlessやgrepコマンドは使います。毎日のようにコマンドを叩いていれば頭よりも先に手が勝手に動いてコマンドを叩けるのですが、ちょっとコマンドを叩かないうちに、「あれ?どうやってコマンド打つんだっけ?」となるので、lessやgrepコマンドで困ったときは、この記事を参照すれば全て解決できる!という意味で記事を作成しました。
>>>私が運営するブログはこちら。メインは技術ブログですが、副業やポイ活についても紹介!
大量のサンプルログ
lessコマンドやgrepコマンドを練習するにあたり、サンプルログを4種類用意しました。
[2022-02-06 02:48:07] local.ERROR: SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = blogs and table_name = migrations and table_type = 'BASE TABLE') {"exception":"[object] (Illuminate\\Database\\QueryException(code: 2002): SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = blogs and table_name = migrations and table_type = 'BASE TABLE') at /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:712)
[stacktrace]
#0 /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php(784): Illuminate\\Database\\Connection->runQueryCallback('select * from i...', Array, Object(Closure))
#1 /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php(764): Illuminate\\Database\\Connection->tryAgainIfCausedByLostConnection(Object(Illuminate\\Database\\QueryException), 'select * from i...', Array, Object(Closure))
#2 /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php(675): Illuminate\\Database\\Connection->handleQueryException(Object(Illuminate\\Database\\QueryException), 'select * from i...', Array, Object(Closure))
#3 /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php(376): Illuminate\\Database\\Connection->run('select * from i...', Array, Object(Closure))
#4 /var/www/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php(44): Illuminate\\Database\\Connection->select('select * from i...', Array)
#5 /var/www/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php(169): Illuminate\\Database\\Schema\\MySqlBuilder->hasTable('migrations')
#6 /var/www/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(652): Illuminate\\Database\\Migrations\\DatabaseMigrationRepository->repositoryExists()
#7 /var/www/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(106): Illuminate\\Database\\Migrations\\Migrator->repositoryExists()
#8 /var/www/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(77): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->prepareDatabase()
#9 /var/www/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(585): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->Illuminate\\Database\\Console\\Migrations\\{closure}()
#10 /var/www/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(94): Illuminate\\Database\\Migrations\\Migrator->usingConnection(NULL, Object(Closure))
#11 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->handle()
#12 /var/www/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()
#13 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure))
#14 /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure))
#15 /var/www/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL)
#16 /var/www/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call(Array)
#17 /var/www/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))
#18 /var/www/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle))
#19 /var/www/vendor/symfony/console/Application.php(1015): Illuminate\\Console\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#20 /var/www/vendor/symfony/console/Application.php(299): Symfony\\Component\\Console\\Application->doRunCommand(Object(Illuminate\\Database\\Console\\Migrations\\MigrateCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
hokkaido
aomori
iwate
yamagata
hukushima
miyagi
nigata
toyama
saitama
tokyo
aichi
okayama
osaka
hyogo
nagano
gunma
yamanashi
shizuoka
gihu
ishikawa
hukui
tochigi
ibaraki
hukuoka
kumamoto
kagoshima
okinawa
[2022-03-24 18:11:42] local.ERROR: Undefined variable $page {"view":{"view":"/var/www/resources/views/app.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-1110990079
data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#304</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-24 18:19:56] local.ERROR: View [layouts.app] not found. {"view":{"view":"/var/www/resources/views/top.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-1527968188 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#304</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-24 19:02:16] local.ERROR: View [header] not found. {"view":{"view":"/var/www/resources/views/layouts/common.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-446646137 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#304</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-25 01:05:00] local.ERROR: View [footer] not found. {"view":{"view":"/var/www/resources/views/top.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-1884878951 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#304</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-25 01:05:29] local.ERROR: Undefined property: Illuminate\View\Factory::$startSection {"view":{"view":"/var/www/resources/views/components/footer.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-357600466 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#304</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-26 16:12:28] local.ERROR: View [layouts.common] not found. {"view":{"view":"/var/www/resources/views/top.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-405570418 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#302</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-26 16:39:48] local.ERROR: View [components.sidebar] not found. {"view":{"view":"/var/www/resources/views/top.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-270753157 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#304</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-27 13:00:01] local.ERROR: Undefined variable $page {"view":{"view":"/var/www/resources/views/layouts/main.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-787196643 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#329</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-27 13:00:10] local.ERROR: Undefined variable $page {"view":{"view":"/var/www/resources/views/layouts/main.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-168221982 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#329</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-27 13:00:39] local.ERROR: Undefined variable $page {"view":{"view":"/var/www/resources/views/layouts/main.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-23
[2022-03-27 13:00:39] local.ERROR: Undefined variable $page {"view":{"view":"/var/www/resources/views/layouts/main.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-236149045 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#329</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-27 13:01:34] local.ERROR: Undefined variable $page {"view":{"view":"/var/www/resources/views/layouts/main.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-1411043516 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#329</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-27 13:01:45] local.ERROR: Undefined variable $page {"view":{"view":"/var/www/resources/views/layouts/main.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-1122182679 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#329</a><samp data-depth=1 class=sf-dump-expanded>
[2022-03-27 14:11:34] local.ERROR: Undefined variable $page {"view":{"view":"/var/www/resources/views/layouts/main.blade.php","data":{"errors":"<pre class=sf-dump id=sf-dump-1189042780 data-indent-pad=\" \"><span class=sf-dump-note>Illuminate\\Support\\ViewErrorBag</span> {<a class=sf-dump-ref>#321</a><samp data-depth=1 class=sf-dump-expanded>
ユーザー1がアクセス
ユーザー1が登録処理を実行
500 ERROR:DBエラーです
404 ERROR:ページがありません
409 ERROR:更新失敗エラーです
403 ERROR:権限エラーです
400 ERROR:バリデーションエラーです
lessとは
指定したファイルを1画面ずつ表示します。
一度に全てのファイルを読み込むわけではないので、catと比べて軽量です。
大量ファイルを開くときは、lessコマンドでファイルを開くようにしましょう。
例えば、lessコマンドでファイルを開くときは下記のように実行します。
-- 基本
less {ファイル名}
-- 例
less laravel.log
-- 複数ファイルの場合
less {ファイル1} {ファイル2} ...
-- 複数ファイルの例
less error.log laravel.log
lessコマンド一覧表
| コマンド | コマンド説明 |
|---|---|
| -N | 行番号を表示 |
| -M | ファイル名、出力している行数/全ての行数、行数の進捗率を表示 |
| -m | 行数の進捗率だけ表示 |
| -S | 長い行の折り返しをせずに1行で表示 |
| &検索文字 | 指定した文字列のみを抽出して表示 |
| / + 検索文字 | 文字列を検索 |
| n | 検索文字の次の候補を表示 |
| N | 検索文字の前の候補を表示 |
| [Shift] + g | ファイルの最終行まで一気に移動 |
| g | ファイルの先頭行まで一気に移動 |
| f | 次のページへ移動 |
| b | 前のページへ移動 |
| :n | 次のファイルへ移動 |
| :p | 前のファイルへ移動 |
| q | ファイルを閉じる |
-N 行番号を表示
行番号を表示する。
※-Nを実行後、コマンドをもう一度実行するともとに戻る。
パターン①
less -N {ファイル名}
less -N laravel.log
パターン②
lessでファイルを開いた後、-Nを実行
-N
出力例
下記のように、ログの左に行数が表示されます。1行のログが長いと、同じ行数の番号が表示されます。
-M ファイル名や全体の行数や行数の進捗率を表示
ファイル名、出力行数/全ての行数、行数の進捗率を表示
※-Mを実行後、コマンドをもう一度実行するともとに戻る。
パターン①
less -M {ファイル名}
less -M laravel.log
パターン②
①lessでファイルを開く
②-Mを実行
-- lessでファイルを開く
less laravel.log
-- -Mを実行
-M
出力例
ターミナルの画面下を見ると、laravel.log lines 1-1/23 49%と表示されているのが確認できます。
※スクロールすると、行数だったり進捗率の%が100%に近づきます。
-m 行数の進捗率を表示
行数の進捗率だけ表示
※-mを実行後、コマンドをもう一度実行するともとに戻る。
パターン①
less -m {ファイル名}
less -m laravel.log
パターン②
①lessでファイルを開く
②-mを実行
-- lessでファイルを開く
less laravel.log
-- -mを実行
-m
出力例
ターミナルの画面下を見ると、49%と表示されているのが確認できます。
※スクロールすると、進捗率の%が100%に近づきます。
-S 長い行の折り返しをせずに1行で表示
長い行の折り返しをせずに1行で表示
※-Sを実行後、コマンドをもう一度実行するともとに戻る。
パターン①
less -S {ファイル名}
less -S laravel.log
パターン②
①lessでファイルを開く
②-Sを実行
-- lessでファイルを開く
less laravel.log
-- -Sを実行
-S
出力例
下記のように、画面右側に>が現れ、1行で表示されるようになります。
→スクロールすると、ログの内容を確認できます。
+'&検索文字' 指定した文字列のみを抽出して表示
指定した文字列のみを抽出して表示
パターン①
less +'&検索文字' laravel.log
less +'&NULL' laravel.log
パターン②
①lessでファイルを開く
②&検索文字を実行
-- lessでファイルを開く
less laravel.log
-- &検索文字を実行
&NULL
出力例
下記のように、NULLの文字を含む行を抽出します。
※&を再度実行すると、もとに戻ります。
/ + 検索文字 文字列を検索
文字列を検索する。
①lessでファイルを開く
②/検索文字を実行
-- lessでファイルを開く
less laravel.log
-- /検索文字を実行
/console
出力例
下記のように、文字列を検索でき、ヒットした文字列があると背景白くなったりします。
n 検索文字の次の候補を表示
/ + 検索文字実行後、検索文字の次の候補を探す。
①lessでファイルを開いた後、/検索文字を実行する。
②nを押下すると、次の候補に移動する。
n
出力例
下記のように、文字列を検索後、nを押すと次の候補に移動してくれる。
N 検索文字の前の候補を表示
/ + 検索文字実行後、検索文字の前の候補を探す。
①lessでファイルを開いた後、/検索文字を実行する。
②Nを押下すると、前の候補に移動する。
N
出力例
下記のように、文字列を検索後、Nを押すと前の候補に移動してくれる。
[Shift] + g ファイルの最終行まで一気に移動
ファイルの最終行まで一気に移動
①lessでファイルを開く
②[Shift] + gを実行する
[Shift] + g
出力例
下記のように、ファイルの最終行に一気にジャンプしてくれるので、出力ファイルが多い場合は便利です。

[Shift] + gを実行すると、ファイルの最終行に移動する。

g ファイルの先頭行まで一気に移動
ファイルの先頭行まで一気に移動
①lessでファイルを開く
②gを実行する
g
出力例
下記のように、ファイルの先頭行に一気にジャンプしてくれるので、出力ファイルが多い場合は便利です。
f 次のページへ移動
開いているファイルの次のページへ移動する。
※スクロールせずとも次のページの出力ができるので便利
①lessでファイルを開く
②fを実行する
f
出力例
次のページへ移動してくれるので意外に便利
b 前のページへ移動
開いているファイルの前のページへ移動する。
※スクロールせずとも前のページの出力ができるので便利
-- lessでファイルを開く
less laravel.log
-- bを実行する
b
b
出力例
前のページへ移動してくれるので意外に便利
:n 次のファイルへ移動
複数のファイルをlessで開くときに、次のファイルへ移動できる。
①lessで複数ファイルを開く
②:nを実行する
— lessで複数ファイルを開く
less data.log server.log
— :nを実行する
:n
出力例
data.logを開いた後、:nを実行するとserver.logに移動する。
:p 前のファイルへ移動
複数のファイルをlessで開くときに、前のファイルへ移動できる。
①lessで複数ファイルを開く
②:nで次のファイルへ移動する
③:pを実行する
— lessで複数ファイルを開く
less data.log server.log
- :nで次のファイルへ移動する
- :n
— :pを実行する
:p
出力例
data.logを開いた後、:nを実行するとserver.logに移動する。
その後、:pを実行するとdata.logに移動する。

:nを実行して、次のファイルに移動する。

:pを実行して、前のファイルに移動する。

q ファイルを閉じる
ファイルを閉じる。
①lessでファイルを開く
②qを実行する
— lessでファイルを開く
less data.log
— qを実行する
q
data.logを開いた後、qを実行することでファイルを閉じる。
>>>私が運営するブログはこちら。メインは技術ブログですが、副業やポイ活についても紹介!
[less応用編]複数のオプションを指定して、lessコマンドを実行したい
less -NMS laravel.log
複数のコマンドを組み合わせたもの。
-N:行番号を表示
-M:ファイル名、出力行数/全ての行数、行数の進捗率
-S:長い行の折り返しをせずに1行で表示
出力例
[less応用編]複数のオプションを指定し、特定の文字列だけ表示して、lessコマンドを実行したい
less -NMS +'&30' laravel.log
複数のコマンドを組み合わせ、さらに特定の文字列を含む行を表示する。
-N:行番号を表示
-M:ファイル名、出力行数/全ての行数、行数の進捗率
-S:長い行の折り返しをせずに1行で表示
+'&検索文字':文字列を検索して行を出力
出力例
[less応用編]複数のファイルを特定の文字列だけ抽出して開く
less +'&error' laravel.log error.log
特定の文字列を含む行を表示し、複数ファイルを出力する。
+'&検索文字':文字列を検索して行を出力
出力例
[less応用編]lsコマンドとlessを|で組み合わせ
ls | less
lsとlessを組み合わせて出力できる。
出力例
>>>私が運営するブログはこちら。メインは技術ブログですが、副業やポイ活についても紹介!
grepとは
ファイルから検索したい条件を探して表示するコマンドです。様々なオプションや検索パターンの組み合わせを覚えておくことで、ログの調査に役立つコマンドとなります。
例えば、grepコマンドで検索するときは下記のように実行します。
-- 基本
grep 検索文字 {ファイル名}
-- 例
grep error error.log
grepコマンド一覧表
| コマンド | コマンド説明 |
|---|---|
| -i | 大文字、小文字を区別せずに検索 |
| -n | 行番号を表示 |
| -v | 検索文字に該当しない行を出力 |
| -e | OR条件で検索 |
| -c | 検索に合致した行数をカウント |
| -C 行数 | 検索結果の前後の行数を指定し、表示 |
| -A 行数 | 検索文字で合致した行の後ろの指定行数も表示 |
| -B 行数 | 検索文字で合致した行の前の指定行数も表示 |
| -l | 検索文字で合致したファイル名を表示 |
| -L | 検索文字で合致したファイル以外を表示 |
| —color=auto | 検索文字を色付きで表示 |
-i 大文字、小文字を区別せずに検索
大文字や小文字を区別せずに検索する。
grep -i ‘検索文字’ {ファイル名}
grep -i 'error' error.log
出力例
error、ERROR、eRRorなど区別せずに検索できる。
-n 行番号を表示
行番号を表示する。
grep -n ‘検索文字’ {ファイル名}
grep -n 'error' error.log
出力例
行の先頭に行番号を表示できる。
-v 検索文字に該当しない行を出力
検索文字に該当しない行を出力する。
grep -v ‘検索文字’ {ファイル名}
grep -v 'ERROR' server.log
出力例
下記の場合、ERRORを含まない行だけ検索できる。
-e OR条件で検索
OR条件で検索する。
grep -e ‘検索文字’ {ファイル名}
grep -e '500' -e '400' server.log
出力例
500、400を含む行だけ検索できる。
-c 検索に合致した行数をカウント
検索に合致した行数をカウントする。
grep -c ‘検索文字’ {ファイル名}
grep -c ‘ERROR’ error.log
出力例
ERRORの文字列を含む行数をカウントする。
→14が出力される。
-C 行数 検索結果の前後の行数を指定し、表示
検索に合致した行数をカウントする。
grep -C 行数 ‘検索文字’ {ファイル名}
grep -C 5 'tokyo' data.log
出力例
tokyoの文字列を含む行と前後5行も検索して出力する。
-A 行数 検索文字で合致した行の後ろの指定行数も表示
検索文字で合致した行の後ろの指定行数も表示
grep -A 行数 ‘検索文字’ {ファイル名}
grep -A 5 'tokyo' data.log
出力例
tokyoの文字列を含む行と後ろ5行も検索して出力する。
-B 行数 検索文字で合致した行の前の指定行数も表示
検索文字で合致した行の前の指定行数も表示
grep -B 行数 ‘検索文字’ {ファイル名}
grep -B 5 'tokyo' data.log
出力例
tokyoの文字列を含む行と前の5行も検索して出力する。
BeforeのBで覚える。
-l 検索文字で合致したファイル名を表示
検索文字で合致したファイル名を表示
grep -l ‘検索文字’ {対象ファイルやディレクトリ}
※小文字のL
grep -l 'ERROR' *.log
出力例
ERRORの文字列を含むファイルを表示する。
-L 検索文字で合致したファイル以外を表示
検索文字で合致したファイル以外を表示
grep -L ‘検索文字’ {対象ファイルやディレクトリ}
grep -L 'ERROR' *.log
出力例
ERRORの文字列を含まないファイルを表示する。
→data.logだけ表示※data.logだけERRORの文字がないため。
—color=auto 検索文字を色付きで表示
検索文字を色付きで表示
grep —color=auto ‘検索文字’ {ファイル名}
grep —color=auto ‘ERROR’ error.log
出力例
ERRORの文字列に背景色をつけて、視覚的にわかりやすく表示できる。
複数のgrepの組み合わせ
grep -i 'error' error.log | grep -v -i 'undefined'
error.logで、大文字・小文字を区別せずにerrorの文字を検索し、undefinedの文字は除外したい。
出力例
grep -i 'error' error.log | grep -v -i 'undefined' | less
error.logで、大文字・小文字を区別せずにerrorの文字を検索し、undefinedの文字は除外したい。さらにパイプを使ってlessでファイルの出力数を抑えたい。
出力例
lessで出力しているので、lessコマンド実行後のコマンドが利用可能です。
例えば、&検索文字でさらに検索したり、-Nで行番号を表示させたりできます。
おわりに
linuxコマンドでよく使うlessとgrepを徹底的に実例も交えながら解説してきました。実務でもよく使うし、ときたまコマンドを忘れてしまうので、ぜひいいねやブックマークをして繰り返し見れるようにしておくのがいいでしょう。
>>>私が運営するブログはこちら。メインは技術ブログですが、副業やポイ活についても紹介!

























