正規表現とは、「いくつかの文字列を一つの形式で表すための表現方法」です。
正規表現を使うことで、たくさんの文章の中から的確に特定のパターンを持つ文字列を検索することができます。
パターンを表現するための特別な文字をメタ文字と言い以下の文字が使用されます。
● メタ文字メタ文字 | 意味 | 記述例 | 記述例の意味 |
. | 任意の一文字 | A .. D | Aで始まり、Dで終わる4文字の文字列 |
(文字列) | 文字列を1つのパターンとして扱う | (ABCD) | ABCDをパターンとする |
+ | 直前の文字やパターンの1回以上の繰り返し | ABX+ | ABとXの1回以上の繰り返し ABX , ABXX , ABXXX |
(AB)+ | パターンABの1回以上の繰り返し AB , ABAB , ABABAB | ||
* | 直前の文字やパターンの0回以上の繰り返し | ABX* | ABとXの0回以上の繰り返し AB , ABX , ABXX , ABXXX |
? | 直前の文字やパターンの0または1回の繰り返し | ABCD? | ABCまたはABCD |
¥ | 次に続く文字またはメタ文字ではなく、文字そのものとして扱う | AB¥* | 文字列AB* |
| | 文字やパターンの選択 | A | B | AまたはB |
(AB)|(CDE) | パターンABまたはCDE | ||
[ ] | [ ]の中のどれか1文字 文字クラス |
[1-9] | 1から9までのいずれか1文字 |
[ABCD] | A,B,C,Dいずれか1文字 [A-D] | ||
^ | 行頭 | ^A | 行の先頭がAで始まる |
$ | 行末 | Z$ | 行の終わりがZのもの |
メタ文字自体を文字として扱う場合は、「 \ 」バックスラッシュに続けてメタ文字を記述します。ただし、\ が有効なのは直後の1文字だけです。メタ文字1字に対してひとつの \ が必要です。
grep コマンドは、ファイルに対してパターンマッチングを行い、マッチする行を出力します。 一部の正規表現を使用することが可能です。検索対象が指定されない場合は、標準入力に対してパターンマッチングを行います。複数のファイルを同時に検索することも可能です。
● grep コマンド構文
grep [オプション] [検索文字列] [ファイル名] |
|
-b | 行のブロック番号をつける |
-c | パターンに一致した行の行数のみを出力する |
-h | 複数ファイルを指定した際に、ファイル名を出力しない |
-i | 大文字と小文字を区別しない |
-l | パターンに一致した行を含むファイル名だけを出力する |
-n | パターンに一致した行のファイル内での行番号を表示する |
-s | エラーメッセージのみを表示する |
-v | パターンに一致しない行を表示する |
# cat test1.txt
acaba acdtj abcfp bcaca vhsir babca# grep 'abc' test1.txt <--- 文字列abcを含む行を検索する abcfp babca# grep '^abc' test1.txt <--- 先頭の文字列abcを含む行を検索する abcfp# grep '[^abc]' test1.txt <--- 文字 a , b , c 以外の文字を含む行を検索する acdtj abcfp vhsir |
egrep も文字列検索で使いますが、複数の検索が一度にできます。 grepよりも高度な正規表現を使用できます。
● egrep コマンド構文
egrep [オプション] [検索文字列パターン] ファイル |
|
-i | 検索する際、アルファベットの大文字小文字を区別しない。 |
-n | マッチした行の行番号も表示する。 |
-c | マッチした行数を出力する。 |
-v | マッチしない行を出力する。 |
-[数値] | マッチした行の前後[数値]行も出力する。 |
-A [数値] | マッチした行の後[数値]行も出力する。 |
-B [数値] | マッチした行の前[数値]行も出力する。 |
^ | 行頭 |
$ | 行末 |
. | 任意の一文字 |
[ABC] | ABCのいずれか |
[A-Z] | A~Zの範囲いずれか |
[^ABC] | ABCいずれでもない |
[^A-Z] | A~Zの範囲いずれでもない |
+ | 1回以上の繰り返し |
* | 0回以上の繰り返し |
{n} | n回の繰り返し |
{n}, | n回以上の繰り返し |
{n,m} | n回以上m回以下の繰り返し |
r1|r2 | 正規表現r1かr2のいずれか |
$ egrep '[0-9]{3}' file01 |
$ egrep 'test01|Test02' file01 |
$ egrep '[0-9]{5,}ミリ秒' file01 |
grep 'CT001.+str1|CT001.+str2' file01 |
正規表現で使用するメタ文字という特殊な文字(\、[、]、^、$、*、.など)を含む文字列を検索する際はメタ文字の前にバックスラッシュ(\)を付けなければなりません。メタ文字が少数であれば問題ありませんが、数が多くなるとバックスラッシュでエスケープするのが大変です。そんなときは、正規表現をサポートしないgrepである fgrep コマンドを使います。fgrepを使う場合は、メタ文字をエスケープしなくても検索ではます。
例えば、「********」という文字を検索する場合、grepコマンドでは、
$ grep "\*\*\*\*\*\*\*\*" file01 |
としなければならないが、fgrepコマンドならば、
$ fgrep "********" file01 |
www.it-shikaku.jp