Linux

【Linuxコマンド】 正規表現でgrepする実例のまとめ

開発をしていると、この関数はどこのソースファイルに記述されているの?この文字列を含む設定ファイルはどこにあるの?なんてことは、良くあることです。

この悩みをサクッと解決してくれるのが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をする場合のコマンド構成になります。

$ grep -E 正規表現 ファイル名

拡張正規表現(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”」になるため、何もヒットしませんでした。

$ grep -E .a test.txt

.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”の文字列がヒットしました。

$ grep -E ab? test.txt
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”の文字列がヒットしました。

$ grep -E ab{2} test.txt
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”の文字列がヒットしました。

$ grep -E [abc3] test.txt
a
ab
abb
abc
abcd
0123 
正規表現 説明
[^…] []の中に無いどれか1文字

[^abc]”の正規表現を使用してgrepしてみます。
検索パターンが「”a”、”b”、”c”以外の任意1文字」になるため、”a”、”b”、”c”の文字列以外がヒットしました。

$ grep -E [^abc] test.txt
abcd
0
01
012
0123

位置関係

正規表現 説明
^ 行の先頭

^0”の正規表現を使用してgrepしてみます。
検索パターンが「行の先頭が”0”」になるため、”0”、”01”、”012”、”0123”の文字列以外がヒットしました。

$ grep -E ^0 test.txt
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」を使用します。

$ find 検索場所 [–regrex] 正規表現

大文字と小文字を区別をつけたくない場合は、「-iregrex」を使用します。

$ find 検索場所 [–iregrex] 正規表現

具体的な使い方をみてみましょう。

 

you
依頼人

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

正規表現は少し複雑ですが、慣れてくると複雑な検索条件を簡単に作ることができるようになります。

以上になります。

サイトマップはこちら↓

▼ Linuxコマンドの記事一覧に戻る

-Linux

Copyright© カズンのブログ , 2020 All Rights Reserved Powered by AFFINGER5.