grep コマンドは、パターンに一致する入力行を選びます。指定ファイルまたは stdin を検索し、一致行の周辺を表示し、選択行を数え、終了ステータスで一致の有無を伝えられます。
テキスト操作 · レッスン 16
grep
固定文字列または正規表現で行を選択し、grep の結果を解釈する方法を学びます。
ファイル内の行を照合する
パターンの後に 1 つ以上の入力ファイルを渡します。
$ grep 'fox' sample.txt
GNU grep は標準でパターンを基本正規表現として解釈し、選択した各行を表示します。空白やシェルのメタ文字が先に解釈されないよう、パターンを引用します。
正規表現ではなく固定文字列として扱うには -F を使います。
$ grep -F 'price: $5.00' products.txt
正規表現として解釈せず、products.txt から文字列 price: $5.00 を検索するコマンドはどれですか?
パターン構文を選ぶ
GNU grep でよく使う 3 つのモードは次のとおりです。
- 標準:基本正規表現。
-E:|、+、?などをバックスラッシュなしで使う拡張正規表現。-F:正規表現演算子を使わない固定文字列。
^ と $ は行頭と行末に一致します。テキスト一覧から文字どおりの接尾辞 .txt で終わるファイル名を照合するには次を使います。
$ grep -E '\.txt$' filenames.txt
バックスラッシュはドットを文字どおりにし、正規表現でエスケープされていない . は任意の 1 文字に一致します。
文字どおりの接尾辞 .txt で終わる行に一致する拡張正規表現はどれですか?
パターンを安全に渡す
-e PATTERN はパターンを明示的に渡します。引用符だけではオプション解析を止められないため、パターンが - で始まる場合に特に便利です。
$ grep -e '-v' settings.conf
-e は繰り返して、いずれかのパターンに一致する行を選べます。-f patterns.txt はファイルから 1 行 1 パターンで読みます。
-v をオプションとして解釈させず、settings.conf からパターン -v を検索するコマンドはどれですか?
選択結果の出力を制御する
-i:大文字小文字の違いを無視する。-n:選択行に行番号を付ける。-v:一致しない行を選ぶ。-c:入力ファイルごとの選択行数を表示する。-o:完全な選択行ではなく、空でない一致部分だけを表示する。
大文字小文字を無視して fox を含む行を数える例です。
$ grep -ic 'fox' sample.txt
-c は一致の総出現数ではなく選択された行を数えます。fox fox を含む 1 行も件数は 1 です。GNU grep で重ならない一致の出現数が必要なら、grep -o PATTERN | wc -l というパイプラインも使えます。
data.txt に error error を含む行が 1 行、一致しない行が 2 行あります。grep -c 'error' data.txt は何を報告しますか?
stdin の絞り込みとディレクトリ検索
入力ファイルがなければ grep は stdin を読み、パイプラインで自然に使えます。
$ env | grep '^USER='
ディレクトリ以下の読み取り可能なファイルを再帰検索するには -r を使います。
$ grep -r 'listen_port' config/
権限エラーなどの診断は stderr へ送られ、照合入力にはなりません。すぐに権限を昇格するのではなく、検索範囲を絞り、権限を理解してください。
generate-report | grep 'failed' で grep は何を検索しますか?
終了ステータスを解釈する
通常の検索で GNU grep は、少なくとも 1 行を選ぶと 0、1 行も選ばなければ 1、エラーなら 2 を返します。これによりスクリプトは「一致なし」を読み取れないファイルや不正なパターンと区別できます。
-q は通常の出力を抑制し、一致を見つけると停止するため条件判定に便利です。表示が空だからといって成否を決めないでください。-q、リダイレクト、一致なし、エラーはいずれも stdout がほぼ空になり得ますが、ステータスは異なります。
固定文字列と正規表現の検索を練習するには、次のラボを試してください。
- Linux で grep を使ってテキストを検索する - 基本検索、行番号、アンカー、基本・拡張正規表現を練習します。
- Linux grep コマンド:パターン検索 -
grepと正規表現でテキスト内のパターンを検索します。 - 干し草の中の針 -
grepでパターン検索、件数集計、一意値の抽出、複数条件の組み合わせを行います。
レッスン完了
grep を完了しました
行指向テキストを検索し、一致とエラーを区別できるようになりました。
基本、拡張、固定文字列の照合を選ぶ。
パターンを引用し、先頭がハイフンなら
-eを使う。選択行数と出現数を混同せずに数える。
stdin を絞り込むか、対象を絞ったディレクトリを再帰検索する。
一致、一致なし、エラーの終了ステータスを解釈する。