LinuxやMacでよく使われるコマンドにgrepコマンドがある。古くから使われているコマンドの一つで、テキストファイルやパイプから流れてくるテキストデータに対して一致処理といったフィルタ処理を行うことができる。指定したパターンや正規表現に一致する行を取り出したり、逆に一致しない行を取り出したり、一致した部分のみを取り出したりと、強力かつ柔軟な処理を提供している。今日では実装系としてGNU grepが使われることが多く、この実装系は処理が高速であることでも知られている。

LinuxやMacを使っていくならgrepコマンドの使い方は習得しておきたい。習得の方法はいくつかあるが、Opensource.comが2021年3月18日(米国時間)、「Practice using the Linux grep command|Opensource.com」にて掲載した記事が入門記事として参考になる。grepの習得を実際の使用例に合わせて説明している。以下、そのポイントを紹介しよう。

grepコマンドの基本的な使い方

grepコマンドは第1引数にパターンを指定し、第2引数にテキストファイルのパスを指定する。パターンの前にオプションを指定できるほか、テキストファイルを指定する代わりにパイプラインやリダイレクトでストリームを接続して使用することも可能。

grepコマンドの基本的な使い方

grep パターン テキストファイル
  • grepコマンドの使い方のサンプル

    grepコマンドの使い方のサンプル

grepコマンドは指定されたパターンに一致する文字列を含む「行」を出力する。大文字と小文字は区別して処理される。

記事はわかりやすさを優先しているためか、指定するオプションにロング名を使っている。日常的に使う場合、ロング名は煩雑なので、実際には短いオプション名を使うことになる。--ignore-caseオプションは「-i」と同じなので、実際には「-i」を使うことが多い。Opensource.comの記事は最後にチートシートを紹介しており、そちらではロング名ではなく短いオプションが使われている。

大文字小文字を無視する方法

grepでは、--ignore-caseオプションを指定することで、大文字と小文字を無視して一致処理を行わせることができる。

大文字と小文字を無視して一致処理を行う方法

grep --ignore-case パターン テキストファイル
  • --ignore-caseオプションの使用例

    --ignore-caseオプションの使用例

例えば、--ignore-caseを指定した場合、パターンに「the」を指定すると「THE」「The」「the」のすべてに一致するようになる。

一致しない行を出力する方法

grepは--invert-matchオプションを指定することで、一致しない行を出力させることができる。--invert-matchオプションを指定すること一致した行を排除するといった動きになる。

一致した行を出力させない方法

grep --invert-match パターン テキストファイル
  • --invert-matchオプションの使用例

    --invert-matchオプションの使用例

「コマンドの出力から特定の行を削除したい」「テキストファイルから特定の行を削除したい」といった場合に活用できる。

正規表現を使う方法

grepコマンドはパターンに正規表現を指定することができる。この場合、正規表現に一致した行が出力されることになる。

正規表現を使用する方法

grep 正規表現 テキストファイル
  • 正規表現の使用例

    正規表現の使用例

記事では、指定する正規表現の例として次の記述方法を取り上げている。

正規表現 内容
. 1文字に一致。
0文字以上の文字列に一致。
+ 1文字以上の文字列に一致。
{数字} 数字回一致。
[文字リスト] 文字リストに含まれる文字に一致。

(注:もし正規表現を指定してうまく動作しなかった場合、--extended-regexpを指定する必要があることもある)。

一致した部分のみを出力する方法

grepコマンドはパターンに一致した「行」を出力する。これに対して--only-matchingオプションを指定すると、パターンに一致した「部分」だけが表示される。

一致した「部分」のみを出力する方法

grep --only-matching パターン テキストファイル
  • --only-matchingオプションの使用例

    --only-matchingオプションの使用例

パターンに正規表現を指定すれば、その正規表現に一致した「部分」だけを抽出することができる。テキストファイルから文中のURLのみを抽出したいといった場合、--only-matchingオプションを使用すれば行のほかの部分は削除してURLの部分だけを直接抽出することが可能。

テキストファイルから取り出したURLを直接ダウンロードするサンプルコマンド

grep --only-matching http\:\/\/.*拡張子 テキストファイル |
curl --remote-name

grepコマンドの--only-matchingオプションは便利なオプションなので、行しか取り出すことができないと思っていた場合、ぜひ一度使ってみて欲しいオプションだ。

チートシートをダウンロードする

記事で取り上げているgrepコマンドの機能はよく使われる機能だ。実際には、grepコマンドはもっと多くの機能を提供している。Opensource.comは紹介したオプションよりも多くのオプションの動作解説を含むチートシートを提供しており、興味があるユーザーに対してダウンロードを薦めている。チートシートにはロングのオプション名ではなく、短いオプション名が記載されており、より実用的な内容になっている。