Linux 正規表現#
Linux の三剣客#
grep
テキストフィルタリングツール(テキストのフィルタリング、検索)sed
ストリームエディタ(行の取得、ファイルの内容の変更)awk
テキスト解析ツール(列の取得、統計計算)
正規表現regexp
ここでは、grep
コマンドを使用して正規表現を学習します(grep
コマンドはパターンに一致するコンテンツをフィルタリングできます)。
grep
コマンドの基本構文:grep パターン ファイル名
パターンは一致するパターンです。
Linux のワイルドカードと正規表現#
- ワイルドカードはファイルに一致するためのもので、シェルによって解釈されます。
ls
、cp
、mv
、find
などのコマンドで使用されます。 - 正規表現はファイルの内容に一致するためのもので、通常は
grep
、sed
、awk
と組み合わせて使用されます。
一般的なワイルドカード
シンボル | 説明 |
---|---|
* | 任意の長さの任意の文字 |
? | 任意の 1 文字 |
[] | 指定された範囲内の任意の 1 文字 |
[^] | 指定された範囲外の任意の 1 文字 |
[[:upper:]] | すべての大文字、[A-Z] と同じ |
[[:lower:]] | すべての小文字、[a-z] と同じ |
[[:alpha:]] | すべての文字、[a-zA-Z] と同じ |
[[:digit:]] | すべての数字、[0-9] と同じ |
[[:alnum:]] | すべての数字と文字、[0-9a-zA-Z] と同じ |
[[:space:]] | すべての空白文字 |
[[:punct:]] | すべての句読点 |
[0-9] は任意の数字を表します
[a-z] は任意の小文字を表します
[A-Z] は任意の大文字を表します
[0-9a-zA-Z] は任意の数字または文字を表します
ファイル test.txt の内容は次の通りです:
[root@localhost ~]# cat test.txt
You and me.
xxx is a hanhan. ^_^
longzhaoqianwowudunjiu.
He can speak english.
Are you kidding?
I think ...
youoy abba ccccc ddd
My phone number is 1872272****.
vvv
ワイルドカードの例#
# 現在のディレクトリに数字で名前が付けられたファイルを検索する
[root@localhost ~]# find . -name [0-9]
[root@localhost ~]# find . -name [[:digit:]]
# test.txtに数字が含まれているコンテンツを検索する
[root@localhost ~]# grep '[[:digit:]]' test.txt
# test.txtに句読点以外のコンテンツを検索する
[root@localhost ~]# grep '[^[:punct:]]' test.txt
基本的なメタ文字#
メタ文字 | 説明 |
---|---|
^ | ^a a で始まるコンテンツ |
$ | a$ a で終わるコンテンツ |
^$ | 空行(Linux のテキストでは、各行の末尾にはデフォルトで $ 記号があります。cat -E file を使用すると確認できます) |
. | 任意の 1 文字(空行以外) |
\ | エスケープ文字、特殊な意味を持つ文字をエスケープします |
* | 直前の文字を 0 回以上繰り返す |
.* | 任意の文字列(すべてのコンテンツに一致) |
^.* | 任意の文字列で始まる(貪欲マッチ) |
[ab] | 中括弧内の任意の 1 文字(a または b) |
[^ab] | ^ の後に続く任意の文字(a または b)の否定 |
\< | 単語の先頭 |
\> | 単語の終わり |
\{n\} | 直前の文字を n 回繰り返す |
\{n,\} | 直前の文字を少なくとも n 回繰り返す |
\{,m\} | 直前の文字を最大 m 回繰り返す |
\{n,m\} | 直前の文字を n 回から m 回繰り返す(少なくとも n 回、最大 m 回) |
例#
# 'Y'で始まる行を検索する
[root@localhost ~]# grep '^Y' test.txt
# 'g'で終わる行を検索する
[root@localhost ~]# grep 'g$' test.txt
# 空行を検索する
[root@localhost ~]# grep '^$' test.txt
# 空行以外を検索する
[root@localhost ~]# grep '.' test.txt
# '.'で終わる行を検索する
[root@localhost ~]# grep '\.$' test.txt
# 連続して出現する0個以上のdを検索する
[root@localhost ~]# grep 'd*' test.txt
# すべてのコンテンツを検索する
[root@localhost ~]# grep '.*' test.txt
# 任意の文字列で始まり、貪欲にマッチする(各行の最後のdに一致します)
[root@localhost ~]# grep '^.*d' test.txt
# 'l'または'x'に一致する
[root@localhost ~]# grep '[lx]' test.txt
# 'l'または'x'に一致しない
[root@localhost ~]# grep '[^lx]' test.txt
# 'l'または'x'で始まる
[root@localhost ~]# grep '^[lx]' test.txt
# 単語'speak'に一致する
[root@localhost ~]# grep '\<speak\>' test.txt
# スペースで始まるコンテンツを検索する
[root@localhost ~]# grep '^[[:space:]]' test.txt
[root@localhost ~]# grep '^[ ]' test.txt
拡張メタ文字#
メタ文字 | 説明 |
---|---|
+ | 直前の文字を 1 回以上繰り返す(少なくとも 1 回)、連続した文字またはテキストを取り出す |
? | 直前の文字を 0 回または 1 回繰り返す(最大 1 回) |
| | または、複数の文字を同時にフィルタリングする |
() | グループ化し、()内の内容を 1 つのまとまりとして扱い、\n(n は数字)は()内の n 番目の括弧内の内容を参照します |
例#
基本表現では、拡張正規表現を使用する場合は、前に \ をエスケープする必要があります。
拡張正規表現を使用するには、egrep
またはgrep -E
を使用し、\ をエスケープする必要はありません。
# 連続する1つ以上のdを含むものを検索する
[root@localhost ~]# grep 'd\+' test.txt
[root@localhost ~]# egrep 'd+' test.txt
[root@localhost ~]# grep -E 'd+' test.txt
# 0回または1回のdを含むものを検索する
[root@localhost ~]# grep -E 'd?' test.txt
# aまたはbに一致する
[root@localhost ~]# grep -E 'a|b' test.txt
# 'and'または'abb'に一致する
[root@localhost ~]# grep -E 'a(nd|bb)' test.txt
# 2つの同じ文字に一致する
[root@localhost ~]# grep -E '([a-z])\1' test.txt
# d文字を最低1回、最大2回繰り返す
[root@localhost ~]# grep -E 'd{1,2}' test.txt
拡張:perl でサポートされている他の一般的なメタ文字#
メタ文字 | 解説 |
---|---|
\d | 数字 |
\D | 数字以外 |
\w | 数字、文字、アンダースコア |
\W | 数字、文字、アンダースコア以外 |
\s | 空白文字 |
\S | 空白文字以外 |
grep -P
を使用すると、perl 正規表現をサポートできます
例#
# すべての単語に一致する
[root@localhost ~] # grep -P '\w+' test.txt
# すべての数字以外に一致する
[root@localhost ~] # grep -P '\D' test.txt