こんにちは、たねやつです。
このシリーズでは、Linuxの基本的なコマンドを一つずつ取り上げ、その使い方を具体的な例とともに解説していきます。今回は、ファイル内やパイプラインからの入力から、指定したパターンに一致する行を検索して表示するgrepコマンドです。
grepコマンドとは?
grepは "Global Regular Expression Print" の略で、テキスト検索のための非常に強力なツールです。ファイルの中から特定の文字列や正規表現にマッチする行を探し出し、その行全体を出力します。ログファイルの調査、設定ファイルからの特定項目の抽出、スクリプト内での条件分岐など、用途は無限大です。
主なオプション
| オプション | 説明 |
|---|---|
-i |
--ignore-caseの略。大文字と小文字を区別せずに検索します。 |
-v |
--invert-matchの略。パターンに一致しない行を表示します。 |
-r or -R |
--recursiveの略。ディレクトリ内を再帰的に検索し、どのファイルにパターンが含まれているかを表示します。 |
-n |
--line-numberの略。一致した行の行番号を一緒に表示します。 |
-c |
--countの略。一致した行の数のみを表示します。 |
-E |
拡張正規表現(ERE)を使って検索します。|(OR条件)などが使えるようになります。egrepと同じです。 |
具体的な使用例
状況1: ログファイルからエラー箇所を特定したい
アプリケーションのログファイルapp.logの中から、ERRORという文字列が含まれる行だけを抽出したい場面です。
grep "ERROR" app.log
app.logからERRORを含む行だけが表示されます。
状況2: 大文字小文字を無視して、行番号付きで検索したい
設定ファイル/etc/ssh/sshd_configから、Portという単語(portかもしれない)がどこに書かれているか、行番号付きで確認したい場面です。
grep -in "port" /etc/ssh/sshd_config
-iで大文字小文字を無視し、-nで行番号が表示されるため、目的の設定項目を素早く見つけることができます。
状況3: 特定のプロセスを除外して表示したい
ps auxコマンドの実行結果から、grep自身のプロセスを除いてssh関連のプロセスだけを見たい場面です。パイプ(|)と-vオプションを組み合わせます。
ps aux | grep "ssh" | grep -v "grep"
ps auxの結果をgrep "ssh"に渡し、さらにその結果からgrepという文字列を含む行を-vで除外しています。
状況4: プロジェクト全体から特定の関数がどこで使われているか探したい
カレントディレクトリ以下のすべてのファイル(サブディレクトリも含む)から、my_functionという関数名が使われている場所をすべて探し出したい場面です。
grep -r "my_function" .
-rオプションを使うことで、どのファイルの何行目で使われているかが一覧で表示され、コードの参照箇所を追跡するのに非常に便利です。
最後に
今回はgrepコマンドについて解説しました。パイプラインと組み合わせることで、他のコマンドの出力をフィルタリングする役割も果たし、Linuxのコマンドライン操作における中心的な存在の一つです。正規表現を使いこなせると、さらに強力なツールになります。