はじめに
皆さんこんにちは、開発課のthree_yagiです。
現在の業務では不具合などが発生したときの原因調査を担当することが多く、本番環境のログの調査をよく行っています。
Linux上に存在するログを調査するにあたって、必須ともいえるのが文字列検索を行う grep コマンドです。
こちらの記事では、grep コマンドについて私が実務でよく使っている検索方法と併せて紹介していきます。
目次
grep コマンドの基本
grepは検索対象のファイルから指定した文字列を含む行を表示するLinuxコマンドです。
正規表現とオプションを駆使することで様々な条件での検索が行えます。
基本構文
$ grep [オプション] 検索文字列 対象ファイル
よく利用するオプションと正規表現
実際によく利用しているオプションについて記載します。
これらを使いこなせれば一通りの検索はできるかなと思います。
オプション
オプション | 説明 |
---|---|
-E | 拡張正規表現(ERE)を利用する ※このオプションなしでも正規表現の「. * ^ $ [ ]」は利用可能 |
-e [検索文字列] | オプションの引数として検索文字列を指定する このオプションを複数回使用することでOR検索が可能 |
-v | 結果を反転する。検索文字列を含む行以外を表示 |
-i | 検索文字列の大文字と小文字を区別しない |
-c | マッチした行ではなく、マッチした行数を表示 |
-m [数字] | [数字]行分だけ表示する |
-B [数字] | マッチした行の前 [数字] 行を表示 |
-A [数字] | マッチした行の後 [数字] 行を表示 |
-C [数字] | マッチした行の前後 [数字] 行を表示 |
-h | 出力する行の前にファイル名を付けないようにする |
-n | 頭にそのファイル内での行数を表示 |
正規表現
正規表現を利用することで柔軟な検索ができるようになります。
拡張正規表現の列が「〇」の正規表現はオプションで「-E」を指定する必要があります。
正規表現 | 意味 | 拡張正規表現 |
---|---|---|
. | 任意の 1 文字 | |
* | 直前の 1 文字または パターンが 0 回以上繰り返す | |
^ | 行の先頭を表す | |
$ | 行の末尾を表す | |
[ ] | 括弧内の任意の 1 文字が存在する | |
( ) | パターンのグループ化 | 〇 |
+ | 直前の 1 文字 または パターンが 1 回以上繰り返す | 〇 |
? | 直前の 1 文字 または パターンが 0 回または 1 回だけ存在 | 〇 |
{n} | 直前の 1 文字 または パターンが n 回繰り返す | 〇 |
| | 2 パターンのうちどちらか片方 | 〇 |
利用例(基本編)
実際の利用例を見ながら利用方法について確認してみましょう。
検索対象のテストファイル(test.txt)には都道府県がローマ字で記載されたファイルを使用しています。
# テスト用ファイル $ cat test.txt hokkaido aomori iwate miyagi akita yamagata ︙ miyazaki kagoshima okinawa
基本の検索
まずは単純に指定した文字列を含む行を表示してみます。
# 【検索条件】'yama' を含む行を表示 $ grep 'yama' test.txt yamagata toyama yamanashi wakayama okayama yamaguchi
AND検索
grepの結果を|(パイプ)
でつなぐことで1つ目のgrepの検索結果に再度grepをかけることになり、AND検索が可能です。
# 【検索条件】'yama' と 'oka'を含む行を表示 $ grep 'yama' test.txt | grep 'oka' okayama
OR検索
OR検索はオプションの「-e」を使って検索文字を複数指定する方法と、正規表現を利用する方法があります。
正規表現を利用する場合は拡張正規表現の「|」を使用するので、オプション「-E」を指定する必要があります。
どちらも結果は同じになるのでお好きな方を利用してください。
# 【検索条件】'yama' または 'oka' を含む行を表示 # 「-e」を使ってOR検索 $ grep -e 'yama' -e 'oka' test.txt # 正規表現でOR検索 $ grep -E 'yama|oka' test.txt # 結果は同じ yamagata toyama yamanashi shizuoka wakayama okayama yamaguchi fukuoka
NOT検索
○○を含む行以外を検索したい場合は、検索結果を反転する「-v」オプションを利用します。
#【検索条件】 'yama'を含まない行を表示 $ grep -v 'yama' test.txt hokkaido aomori iwate miyagi akita fukushima ibaraki ⁝
複数指定する場合
#【検索条件】 'yama' と 'oka'を含まない行を表示 # OR検索の結果を「-v」で反転させればどちらも含まない行を表示できます $ grep -v -e 'yama' -e 'oka' test.txt $ grep -v -E 'yama|oka' test.txt (結果省略)
大文字と小文字を区別しないで検索
デフォルトでは文字の大文字と小文字を区別した状態で検索を実行します。
大文字と小文字を区別せずに検索する場合は「-i」オプションを利用します。
# オプションなしだと'Yama'を含む行しか対象とならないのでいずれの行も出力されません $ grep 'Yama' test.txt # オプションありだと'yama'も対象となるので結果が出力されます $ grep -i 'Yama' test.txt yamagata toyama ⁝
マッチした行数を表示
「-c」オプションを用いることで検索結果の行ではなく行数が表示されます。
#【検索条件】'yama'を含む行の合計の行数を表示 $ grep -c 'yama' test.txt 6
マッチした行のうち〇行だけ表示
「-m」オプションで結果を表示する行数を指定できます。
#【検索条件】'yama'を含む行のうち頭から2行分だけ表示 $ grep -m 2 'yama' test.txt yamagata toyama
マッチした行の前後の行も表示する
「-B」「-A」「-C」オプションを利用することでマッチした行の前後の行も表示できます。
「-B」「-A」で前と後それぞれの表示する行数を指定でき、「-C」で前後まとめて行数を指定できます。
ログを調査する際にはよく使うオプションです。
#【検索条件】 'tokyo' を含む行を前後1行も含めて表示 # 「-B」「-A」で前後それぞれ指定 $ grep -B 1 -A 1 'tokyo' test.txt # 「-C」でまとめて指定 $ grep -C 1 'tokyo' test.txt chiba tokyo kanagawa
#【検索条件】 'tokyo' を含む行を前3行,後2行も含めて表示 $ grep -B 3 -A 2 'tokyo' test.txt gunma saitama chiba tokyo kanagawa niigata
正規表現で様々な条件で検索する
#【検索条件】'〇a〇a〇a'という文字列を含む行を表示 # '.'は任意の1文字 $ grep '.a.a.a' test.txt yamagata kanagawa yamanashi wakayama okayama kagawa nagasaki # こちらも同じ条件での検索となる # '( )' グループ化 # '{n}'直前の文字のn回の繰り返し $ grep -E '(.a){3}' test.txt
#【検索条件】'a'で始まる行を表示 # `^`は行頭を意味する $ grep '^a' test.txt aomori akita aichi
#【検索条件】'a'で始まり先頭以外にも'a'を含む行を表示 # '*'は直前の文字の0回以上の繰り返し # '.'と組み合わせた '.*' は任意の0 or n文字を表す $ grep '^a.*a' test.txt akita
利用例(応用編)
grepした文字をハイライト表示
--color=always
で検索した文字列に色を付けることができます。
検索結果が大量のときや、正規表現で検索していてどこからどこまでがマッチしているか確認したいときなどに便利です。
$ grep --color=always -E '(.a){3}' test.txt
このように表示されます
圧縮ファイルをgrepする
ログファイルなどは圧縮された状態で保存されていることが多いかと思います。
圧縮されたファイルに対してはzgrep
コマンドを利用することでgrepと同じように検索できます。
grepと同じオプションや正規表現も利用でき、使用方法としてはgrepと同じになります。
$ zgrep -i 'Yama' test.gz
grepコマンド まとめ
grepコマンドはLinuxを利用するにあたって必須ともいえるコマンドです。
使いこなせるようになればファイルの検索などのスピードが劇的にアップします。
今回紹介したのは一部のオプション、正規表現となります。
他にも有用なものはたくさんあるのでぜひご自身で調べてみてください。
◆ Linuxの理解をより深めたい方へ以下関連おすすめブログ
・ls コマンド 【使い方 まとめ】
・よく使うLinuxコマンド一覧【最新版】
・sar コマンド【使い方 まとめ】
・iptables まとめ【Linux ファイアウォール】
・sed コマンド【使い方 まとめ】
・ vi コマンド【使い方まとめ】
・ Linuxのファイル操作でよく使うLinuxコマンド
・ 初心者のためのawkコマンド
・ 実務で使える!基本的なシェル(Linux)コマンドの話 ~forとsed~
・ 【Linux】今振り返りたい、プロセスって何?
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
https://rakus.hubspotpagebuilder.com/visit_engineer/rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com