Grep を使用してファイル内でパターン検索を実行する方法
このページでは
- Grep を使用した大文字と小文字を区別しない検索
- 特定の一致しない行を、一致する文字列を含む行と共に表示する
- Grep で一致した文字列のみを出力する
- Grep での表示位置
- 結論
grep コマンドに関する最初の記事では、このツールを使用して単語のみを検索する方法、2 つの単語を検索する方法、一致した単語を含む行をカウントする方法など、ツールが提供するかなりの数の機能について説明しました。これらとは別に、このツールは、より理解しやすく便利な機能をいくつか提供します。この記事では、それらのいくつかについて説明します。
このチュートリアルに記載されているすべての例は、Ubuntu 14.04LTS でテストされていることに注意してください。また、このチュートリアルのすべての grep 関連の例では、次のファイル (test_file1.txt) を使用します。
Grep を使用した大文字と小文字を区別しない検索
デフォルトでは、grep は大文字と小文字を区別します。つまり、たとえば、ABC と abc を別々に扱います。ただし、検索で大文字と小文字を区別しないようにする場合は、-i コマンド ライン オプションを使用できます。
grep -i [string-to-be-searched] [filename]
例えば:
grep -i "linux" test_file1.txt
注: パターン (上記の例の linux など) だけでなく、grep の man ページには、-i オプションを使用すると、入力ファイルの大文字と小文字の区別も確実に無視されると記載されています。抜粋は次のとおりです。
-i, --ignore-case
Ignore case distinctions in both the PATTERN and the input files. (-i is specified by POSIX.)
ただし、入力ファイル関連の動作を再現することはできませんでした。
Grep で一致する文字列を含む行で特定の一致しない行を表示する
このツールを使用すると、一致した文字列を含む行の後、前、または前後に指定した行数を表示することもできます。
-A コマンド ライン オプションを使用して、一致した行の後に N 行を出力します。
$ grep -A N [string-to-be-searched] [filename]
例えば:
$ grep -A 2 "linux" test_file1.txt
上記のコマンドの出力は次のとおりです
同様に、-B コマンド ライン オプションを使用して、一致した行より前の行を表示します。
$ grep -B N [string-to-be-searched] [filename]
例えば:
$ grep -B 2 "linux" test_file1.txt
出力は次のとおりです。
最後に、一致した行の周囲の行を出力するには、-C コマンド ライン オプションを使用します。
$ grep -C N [string-to-be-searched] [filename]
例えば:
$ grep -C 2 "linux" test_file1.txt
キャプチャされた出力は次のとおりです。
Grep で一致した文字列のみを出力する
また、一致した文字列のみを標準出力に出力することもできます (デフォルトで表示される完全な行ではなく)。この機能には、-o コマンド ライン オプションを使用してアクセスできます。
$ grep -o [string-to-be-searched] [filename]
たとえば、要件がファイル内の文字列 \linux\ を検索することである場合 (ただし、行全体を出力してはなりません)、次のコマンドを使用します。
$ grep -o "linux" [file-name]
* や .* などのワイルドカード文字を使用して、複数の文字列を grep することもできます。たとえば、\how\ から始まり、\linux\ で終わる単語のグループを grep したい場合は、次のコマンドを使用できます。
$ grep -o “how.*linux” [file-name]
Grepでの表示位置
grep コマンドを使用すると、一致した文字列が発生する行のバイト オフセットを表示することもできます。この機能には、-b コマンド ライン オプションを使用してアクセスできます。ただし、このオプションをより適切に使用するには、-o コマンド ライン オプションと一緒に使用すると、一致した文字列の正確な位置が表示されます。
$ grep -o -b [string-to-be-searched] [filename]
例えば:
$ grep -o -b "for" test_file1.txt
出力は次のとおりです。
結論
これらすべてのオプションを毎日必要とするわけではありませんが、いつ便利になるか分からないため、少なくとも知っておく必要があります。 grep は正規表現と併用するとさらに強力になりますが、その話題は別の機会に譲ります。