【Shell】ファイル検索時における正規表現の備忘録

■正規表現とは

正規表現とは、「 ^ 」のような特定の記号(メタ文字)を使用する。
正規表現には、いくつか種類があり、使用するメタ文字も異なる。その中でも、代表的な正規表現は、「基本正規表現」と「拡張正規表現」である。

今回は、正規表現の使用方法を備忘録として記す。

■やりたいこと

以下のファイルについて「grep」コマンドと正規表現を使用して検索していく。

▼sample.txt

/work/aaa/hoge_1.txt
/work/aaa/hoge_5.txt
/work/aaa/hoge_a.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf
/work/aaa/hoge_b.txt
/work/aaa/hoge_p.txt
/work/aaa/hoge_p.conf
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_7.txt
/work/bbb/hoge_E.txt
/tmp/ccc/hoge_1.txt
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_Y.conf
/tmp/eee/hoge_s.txt

▼数字や文字で特定する

任意の数字や文字を指定する方法を下表に示す。

基本正規表現拡張正規表現概要
[ ][ ][ ]の中に含まれるいずれかの1文字
[^ ][^ ][ ]の中に含まれないいずれかの1文字

・任意の数字1つ

$ grep 'hoge_[1]' sample.txt
/work/aaa/hoge_1.txt
/work/bbb/hoge_1.txt
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt

$ grep 'hoge_[2]' sample.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf

$ grep 'hoge_[3]' sample.txt

hoge_[3]はsample.txtに存在しないため、何も表示されない。

・任意の数字2つ

$ grep 'hoge_[12]' sample.txt
/work/aaa/hoge_1.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt

hoge_1またはhoge_2が検索結果に表示される。

・任意の数字1から9

$ grep 'hoge_[0-9]' sample.txt
/work/aaa/hoge_1.txt
/work/aaa/hoge_5.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_7.txt
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt

sample.txt内のhoge_[数字]が表示される。

・任意の数字1から9以外

$ grep 'hoge_[^0-9]' sample.txt
/work/aaa/hoge_a.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf
/work/aaa/hoge_b.txt
/work/aaa/hoge_p.txt
/work/aaa/hoge_p.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_E.txt
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_Y.conf
/tmp/eee/hoge_s.txt

sample.txt内のhoge_[数字]以外が表示される。

・任意の文字1つ(小文字)

$ grep 'hoge_[a]' sample.txt
/work/aaa/hoge_a.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf

$ grep 'hoge_[b]' sample.txt
/work/aaa/hoge_b.txt
/tmp/ccc/hoge_b.txt
/tmp/ccc/hoge_b.conf
/tmp/eee/hoge_b.txt

sample.txt内のhoge_[英語小文字]が表示される。

・任意の文字aからz(小文字)

$ grep 'hoge_[a-z]' sample.txt
/work/aaa/hoge_a.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf
/work/aaa/hoge_b.txt
/work/aaa/hoge_p.txt
/work/aaa/hoge_p.conf
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_s.txt

sample.txt内のhoge_[英語小文字]が表示される。

・任意の文字aからz以外(小文字)

$ grep 'hoge_[^a-z]' sample.txt
/work/aaa/hoge_1.txt
/work/aaa/hoge_5.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_7.txt
/work/bbb/hoge_E.txt
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_Y.conf

sample.txt内のhoge_[英語小文字]以外が表示される。

・任意の文字AからZ(大文字)

$ grep 'hoge_[A-Z]' sample.txt
/work/bbb/hoge_D.txt
/work/bbb/hoge_E.txt
/tmp/eee/hoge_Y.conf

sample.txt内のhoge_[英語大文字]が表示される。

・任意の数字1から9と文字AからZ(大文字)

$ grep 'hoge_[0-9A-Z]' sample.txt
/work/aaa/hoge_1.txt
/work/aaa/hoge_5.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_7.txt
/work/bbb/hoge_E.txt
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_Y.conf

sample.txt内のhoge_[数字]とhoge_[英語大文字]表示される。

▼位置で特定する

位置を指定する方法を下表に示す。

基本正規表現拡張正規表現概要
^^先頭
$$末尾

・先頭の文字を指定

$ grep '^/tmp' sample.txt
/tmp/ccc/hoge_1.txt
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_Y.conf
/tmp/eee/hoge_s.txt

sample.txt内の/tmpで始まる文字が表示される。

・末尾の文字を指定

$ grep '1.txt$' sample.txt
/work/aaa/hoge_1.txt
/work/bbb/hoge_1.txt
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt

sample.txt内の1.txtで終わる文字が表示される。

▼繰り返しで特定する

繰り返しで特定する方法を下表に示す。

基本正規表現拡張正規表現概要
**0以上の繰り返し(ワイルドカード)
なし+1回以上の繰り返し
なし?0または1回以上の繰り返し
\{m,n\}{m,n}m回以上、n回以下の繰り返し
\{m\}{m}m回の繰り返し
\{m,\}{m,}m回以上の繰り返し
\{, n\}{,n}n回以下の繰り返し

・0以上の繰り返し(ワイルドカード)

$ grep '/tmp*' sample.txt
/tmp/ccc/hoge_1.txt
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_Y.conf
/tmp/eee/hoge_s.txt

sample.txt内の/tmpを含む文字が表示される。

・1以上の繰り返し

$ grep -E '/tmp+' sample.txt
/tmp/ccc/hoge_1.txt
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_Y.conf
/tmp/eee/hoge_s.txt

sample.txt内の/tmpを含む文字が表示される。

※拡張正規表現を使用する場合は、grepコマンドのオプション「-E」を付与する。

・0または1回の繰り返し

$ grep -E '.con?' sample.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf
/work/aaa/hoge_p.conf
/work/bbb/hoge_2.conf
/tmp/ccc/hoge_b.conf
/tmp/eee/hoge_Y.conf

sample.txt内の.confを含む文字が表示される。

・2回以上4回以下の繰り返し

$ grep '/work/b\{2,4\}' sample.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_7.txt
/work/bbb/hoge_E.txt

$ grep -E '/work/b{2,4}' sample.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_7.txt
/work/bbb/hoge_E.txt

sample.txt内の/bbbを含む文字が表示される。

▼複数条件(OR句)で特定する

複数条件を指定する方法を下表に示す。

基本正規表現拡張正規表現概要
なし|複数条件(OR句)
$ grep -E 'hoge_[1]|.conf$' sample.txt
/work/aaa/hoge_1.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf
/work/aaa/hoge_p.conf
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.conf
/tmp/ccc/hoge_1.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_Y.conf

sample.txt内のhoge_1もしくは末尾が.confのものを表示する。

コメント