Linux

パターンにマッチした行を表示する grep コマンド

投稿日:2018年12月5日 更新日:

1. はじめに

grep は、対象ファイルの中で、指定した文字列パターンにマッチした行を表示するコマンドです。

※ 本ページで扱うのは GNU grep v2.25 です。

2. 主な使い方

個人的に、よく使うのは以下の使い方です。

$ grep -inR 文字列パターン 対象ファイルパス
  • 「対象ファイルパス」はディレクトリでもOKです(-R オプションを指定しているため)。

指定した3つのオプションを表にしました。

grep の主要オプション
オプション 説明
-i, --ignore-case 大文字・小文字を区別しない。
-n, --line-number 行頭に行番号を出力する。
-R, -r, --recursive ディレクトリ内のファイルも再帰的に検索する。

例1

以下が記述された hello.c ファイルがカレントディレクトリに置いてあるとします。

#include <stdio.h>
int main()
{
   printf("Hello, Foo!");
   printf("Hello, Bar!");
   printf("Hello, Baz!");
   return 0;
}

hello.c ファイル内の “Hello” という文字列を検出する場合は、以下のようにコマンドを実行します。

$ grep Hello hello.c
   printf("Hello, Foo!");
   printf("Hello, Bar!");
   printf("Hello, Baz!");

例2

同じ hello.c ファイルが、test ディレクトリ内に置いてあるとします。

test
 └─ hello.c

この場合は、先程紹介した -R オプションを使って再帰的にディレクトリ内のファイルまで処理の対象とすることができます。

$ grep -R Hello test
test/hello.c:   printf("Hello, Foo!");
test/hello.c:   printf("Hello, Bar!");
test/hello.c:   printf("Hello, Baz!");

では、3つのオプションを全て指定して実行します。文字列パターンは、”hello” と小文字にしておきます。

$ grep -inR hello test
test/hello.c:4:   printf("Hello, Foo!");
test/hello.c:5:   printf("Hello, Bar!");
test/hello.c:6:   printf("Hello, Baz!");

-i オプションにより、”Hello” がマッチされました。また、-n オプションにより、マッチした行番号が表示されました。

3. その他のオプション

それ以外で、時々使うオプションです。

その他のオプション
オプション 説明
-E, --extended-regexp
  • 指定した文字列を拡張正規表現として扱います。
-v, --invert-match
  • マッチしない行を出力します(条件が反転します)。
-a, --text
  • ファイルをテキストファイルとして扱います。
  • テキストファイルを対象とする場合は、このオプションを指定しましょう。grep コマンドが勝手にバイナリファイルだと認識して、出力結果がおかしくなることがあるからです。

4. 正規表現について

grep では以下の3つの正規表現を使うことができます。

  1. 基本正規表現 (BRE)
  2. 拡張正規表現 (ERE)
  3. Perlの正規表現 (PCRE)
grep の正規表現の種類
正規表現の種類 説明
基本正規表現 (BRE)
  • デフォルトの正規表現。
  • かなりいろいろな正規表現演算子が使えますが、特殊記号をエスケープする必要があったりして少々面倒です。
  • 使用できる正規表現演算子:正規表現メモ #GREP
拡張正規表現 (ERE)
  • この正規表現を使うには、-Eオプションを指定する(もしくは `egrep` コマンド)。
  • BRE より多くの正規表現演算子が使えます。ちゃんと正規表現を使いたい場合は、こちらを使うことをお勧めします。
  • 使用できる正規表現演算子:正規表現メモ #EGREP
Perlの正規表現 (PCRE)

簡単な表現しか使わないのであれば基本正規表現でよいですが、ちゃんと正規表現を指定したい場合は、-E オプションを使って拡張正規表現を使いましょう。

📂-Linux

執筆者:labo


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Linux

du コマンドのエイリアスをメモ

du コマンドのエイリアスをメモ。

Linux

sed コマンドの基本形式

sed コマンドの基本的な指定形式について説明します。

Linux

Ubuntu のパッケージ更新で unmet dependencies が起きた場合に対応する

Ubuntu のパッケージ更新で unmet dependenciesが起きた場合に対応する方法を紹介します。

Linux

【Linux】Info マニュアルの基礎知識と、閲覧に便利な pinfoコマンド

目次1. オンラインマニュアル (manコマンド)と Infoマニュアル (infoコマンド)2. Info マニュアルの基礎知識Info マニュアルのデータpinfo コマンドウェブ版もあります3. …

docker

docker run コマンドのパターン覚書

docker run コマンドのパターン覚書です。