開発をしていると、この関数はどこのソースファイルに記述されているの?この文字列を含む設定ファイルはどこにあるの?なんてことは、良くあることです。
この悩みをサクッと解決してくれるのがgrepコマンドです。
今回は、正規表現を使ってgrepする方法を中心に紹介します。
最後のほうに、findの正規表現についても触れていますので、参考にしてください!
正規表現とは?
正規表現は、ある文字列の並びの条件をパターン化するために使用します。
「ある文字列の並びの条件」が複雑であればあるほど、正規表現は効果を発揮します。
「ある特定のパターンでgrepしたいな」と思ったときは、ぜひ正規表現をご検討ください!
grepコマンドの正規表現の種類
はじめにgrepコマンドのヘルプを見てみましょう。
正規表現に関係がありそうな、オプションを紹介します。
$ grep --help
:
正規表現の選択および解釈:
-E, --extended-regexp PATTERN を拡張正規表現 (ERE) とする
-G, --basic-regexp PATTERN を基本正規表現 (BRE) とする
-P, --perl-regexp PATTERN を Perl 正規表現とする
:
全部で拡張正規表現(ERE)、基本正規表現(BRE)、Perl正規表現の3パターンになります。
今回は、通常使用される拡張正規表現(ERE)を中心に説明していきます。
拡張正規表現(ERE)を使用して、grepをする場合のコマンド構成になります。
拡張正規表現(ERE)の実例
grepするファイルを開いて文字列を確認しましょう。
$ vi test.txt
a
ab
abb
abc
abcd
0
01
012
0123
文字列関係
実際に正規表現を使ってgrepしてみます。
正規表現 | 説明 |
. | 任意の1文字 |
“.”の正規表現を使用してgrepしてみます。
検索パターンが「任意の1文字」になるため、全ての文字列がヒットしました。
$ grep -E . test.txt
a
ab
abb
abc
abcd
0
01
012
0123
“.a”の正規表現を使用してgrepしてみます。
検索パターンが「1番目の文字が任意、2番目の文字が“a”」になるため、何もヒットしませんでした。
“.b”の正規表現を使用してgrepしてみます。
検索パターンが「1番目の文字が任意、2番目の文字が“b”」になるため、”ab”の文字列がヒットしました。
$ grep .b test.txt
ab
abb
abc
abcd
正規表現 | 説明 |
* | 直前の文字の0回以上の繰り返し |
“ab*”の正規表現を使用してgrepしてみます。
検索パターンが「1番目の文字が”a”、2番目以降が”b”の0回以上の繰り返し」になるため、”a”、”ab”、”abb”の文字列がヒットしました。
$ grep -E ab* test.txt
a
ab
abb
abc
abcd
正規表現 | 説明 |
+ | 直前の文字の1回以上の繰り返し |
“ab+”の正規表現を使用してgrepしてみます。
検索パターンが「1番目の文字が”a”、2番目以降が”b”の1回以上の繰り返し」になるため、”ab”、”abb”の文字列がヒットしました。
$ grep -E ab+ test.txt
ab
abb
abc
abcd
正規表現 | 説明 |
? | 直前の文字は省略可能 |
“ab?”の正規表現を使用してgrepしてみます。
検索パターンが「1番目の文字が”a”、2番目の文字は、”b”か”b”を省略」になるため、”a”、”ab”の文字列がヒットしました。
a
ab
abb
abc
abcd
正規表現 | 説明 |
~|… | ~または…のどっちか |
“a|b”の正規表現を使用してgrepしてみます。
検索パターンが「”a”または”b”」になるため、”a”、”b”の文字列がヒットしました。
$ grep -E “a|b” test.txt
a
ab
abb
abc
abcd
正規表現 | 説明 |
{n} | 直前の文字n回繰り返し |
“ab{2}”の正規表現を使用してgrepしてみます。
検索パターンが「1番目の文字が”a”、2番目以降が”b”が2回」になるため、”abb”の文字列がヒットしました。
abb
正規表現 | 説明 |
[…] | []の中のどれか1文字 |
“[abc]”の正規表現を使用してgerpしてみます。
検索パターンが「”a”、”b”、”c”のどれか1文字」になるため、”a”、”b”、”c”の文字列がヒットしました。
$ grep -E [abc] test.txt
a
ab
abb
abc
abcd
続いて、“[abc3]”の正規表現を使用してgrepしてみます。
検索パターンが「”a”、”b”、”c”、”3”のどれか1文字」になるため、”a”、”b”、”c”、”3”の文字列がヒットしました。
a
ab
abb
abc
abcd
0123
正規表現 | 説明 |
[^…] | []の中に無いどれか1文字 |
“[^abc]”の正規表現を使用してgrepしてみます。
検索パターンが「”a”、”b”、”c”以外の任意1文字」になるため、”a”、”b”、”c”の文字列以外がヒットしました。
abcd
0
01
012
0123
位置関係
正規表現 | 説明 |
^ | 行の先頭 |
“^0”の正規表現を使用してgrepしてみます。
検索パターンが「行の先頭が”0”」になるため、”0”、”01”、”012”、”0123”の文字列以外がヒットしました。
0
01
012
0123
正規表現 | 説明 |
$ | 行の末尾 |
“2$”の正規表現を使用してgrepしてみます。
検索パターンが「行の末尾が”2”」になるため、”012”の文字列以外がヒットしました。
$ grep -E $2 test.txt
012
正規表現で複雑な文字列検索の実例
ここでは、もう少し複雑な文字列をgrepしてみましょう。
grepするファイルを開いて文字列を確認しましょう。
$ vi url.txt
https://surume-ika.com
http://surume-ika.com
https://www.surume-ika.com
http://www.surume-ika.com
検索パターンを「“http://”または”https://”ではじまり、最後が”.com”で終わる文字列」を条件に検索します。
全ての行がヒットしました。
$ grep -E https?://.*.com url.txt
https://surume-ika.com
http://surume-ika.com
https://www.surume-ika.com
http://www.surume-ika.com
続いて、「“http://www”または”https://www”ではじまり、最後が”.com”で終わる文字列」を条件に検索します。
$ grep -E https?://w{3}.*.com url.txt
https://www.surume-ika.com
http://www.surume-ika.com
URLのような複雑な文字列パターンも正規表現を使えば、簡単にgrepすることができます。
findの正規表現
findコマンドで正規表現を使うときは、「-regrex」を使用します。
大文字と小文字を区別をつけたくない場合は、「-iregrex」を使用します。
具体的な使い方をみてみましょう。

workフォルダにある、拡張子logとtxtのファイル一覧を出してくれない?
はじめに、workフォルダの中のファイルを確認してみましょう。
$ls ./work/
01pass abc.log pas01 password password.lower test.log test01.txt
0pass abc11.txt pass02 test.jpg test.png test1.jpg
abc.log、test.log、test01.txt、abc11.txtのファイルが検索にヒットしそうですね。
正規表現でworkフォルダの中にある拡張子log、txtのファイル一覧を表示してみます。
$ find ./work/ -regrex “.*.\(log\|txt\)”
./work/test01.txt
./work/abc.log
./work/text.log
./work/abc11.txt
予想通りの結果になりました。
正規表現のはじめに「.*」を入れる理由としては、「0文字以上の任意の文字列」を条件として入れるためです。
この条件を入れることにより、ファイル名やパスが任意となり、拡張子logまたはtxtのみが、検索条件になってくれます。
続いて、「-name」を使って同じ条件で検索をすると、2回コマンド実行が必要になります。
$ find ./work/ -name *.log
./work/abc.log
./work/text.log
$ find ./work/ -name *.txt
./work/test01.txt
./work/abc11.txt
正規表現は少し複雑ですが、慣れてくると複雑な検索条件を簡単に作ることができるようになります。
以上になります。
サイトマップはこちら↓