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

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

関連記事

CentOS

CentOS 8 を CentOS Stream に移行するコマンド

目次1. 突然の CentOS 8 終了宣言2. CentOS Stream に移行するコマンド3. 2021年5月:移行作業を行いました4. 参考 1. 突然の CentOS 8 終了宣言 Cent …

Linux

umask によって適用されるパーミッションの確認ページを作成しました

Linux (や Mac) では、ファイルやディレクトリに「パーミッション」を設定することでアクセスを制限します。 パーミッションは、「所有者」「所有グループ」「その他」の3者に対して、 ファイルなら …

CentOS

CentOS 6 での yum update エラーに対応しました

問題 先日、CentOS 6.9 で yum update したところ、以下のエラーが発生しました。 https://ca.mirror.babylon.network/remi/enterprise …

Linux

【Linux】 CentOS のマニュアル

CentOS は、RHEL (Red Hat Enterprise Linux)のソースコードから商標や商用パッケージ等を除去してリビルドした RHELクローンです。 マニュアルを見る場合は、RHEL …

CentOS

CentOS 8 で Snap から certbot パッケージをインストールする

CentOS 8 で Snap から certbot パッケージをインストールする方法について説明します。