Q1正規表現で行頭に一致させる記号はどれですか?
基本正規表現 — grep で使うパターン
grepの基本正規表現を ^/$/./*/[] の5記号と拡張表現 -E、一致部分だけ出す -o まで、テキストファイルからの抽出で確かめます。
正規表現を試せるツール
本記事のパターンは、ブラウザ上で動く正規表現テスターでも試せます。入力テキストに対して、パターンの一致箇所をその場で確認できます。
基本正規表現 — ^ $ . * []
正規表現は、文字列のパターンを表す書き方です。grepは探す文字列を正規表現として解釈するため、固定文字列だけでなく「行頭がこの文字」「ここに任意の1文字」といった条件で行を探せます。基本正規表現で覚える記号は^・$・.・*・[]の5つです。
^は行頭、$は行末を表すアンカーです。.は任意の1文字に一致し、*は直前の文字の0回以上の繰り返しを表します。[abc]は角かっこ内のいずれか1文字、[a-z]は範囲で小文字1文字に一致します。これらを組み合わせて柔軟な検索ができます。
^は行頭、$は行末、.は任意の1文字を表します。| 記号 | 意味 | 例 | 例の意味 |
|---|---|---|---|
^ | 行頭に一致 | grep '^c' f | cで始まる行を探す |
$ | 行末に一致 | grep 't$' f | tで終わる行を探す |
. | 任意の1文字に一致 | grep 'c.t' f | cとtの間が任意1文字(cat/cot) |
* | 直前の文字の0回以上の繰り返し | grep 'ab*c' f | aとcの間にbが0個以上(ac/abc) |
[abc] | いずれか1文字に一致 | grep '[cb]at' f | catまたはbatを探す |
[a-z] | 範囲のいずれか1文字に一致 | grep '[a-z]at' f | 小文字1文字+at(cat/bat) |
\| | いずれかに一致(または) | grep 'cat\|dog' f | catまたはdogを含む行 |
echo -e 'cat\ncot\ndog' > words.txt # 素材を作成
grep '^c' words.txt # c で始まる cat と cot
grep 't$' words.txt # t で終わる cat と cot
grep 'c.t' words.txt # c?t に一致する cat と cot
繰り返しと文字クラス — * と []
*は直前の文字の0回以上の繰り返しを表します。ab*cはac・abc・abbcのようにbが0個以上ある行に一致します。[]は角かっこ内のいずれか1文字に一致し、[cb]atはcatとbatの両方を拾います。[a-z]のように範囲を書くと小文字1文字を表せます。
echo -e 'ac\nabc\nabbc\naxc' > rep.txt # 素材を作成
grep 'ab*c' rep.txt # b が 0 個以上の ac abc abbc
echo -e 'cat\nbat\nrat' > cls.txt # 素材を作成
grep '[cb]at' cls.txt # cat と bat の 2 行
または — \| でいずれかに一致
基本正規表現では|(または)はそのままだと普通の文字として扱われます。
選択を表すにはバックスラッシュを付けて\|と書き、grep 'cat\|dog'はcatかdogを含む行に一致します。
後半で学ぶgrep -Eなら、\|の代わりに|をそのまま書けます。
echo -e 'cat\ndog\nfox' > sel.txt # 素材を作成
grep 'cat\|dog' sel.txt # cat か dog を含む 2 行
拡張正規表現と一致部分の出力 — grep -E / grep -o
基本正規表現では+ | ( )は\+ \| \( \)のようにエスケープが必要ですが、grep -Eならそのまま書けます。grep -Eは拡張正規表現(ERE)を有効にします。基本正規表現ではエスケープが必要だった+(1回以上)や|(または)、()(グループ)を、そのまま書けるようになります。grep -E 'cat|dog'はcatかdogを含む行に一致します。
grep -oは一致した行全体ではなく、一致した部分の文字列だけを出力します。1行に複数の一致があれば、それぞれを別の行として出します。ログから一致箇所だけを取り出して数えたいときに役立ちます。
| 記号 | 意味 | 例 | 例の意味 |
|---|---|---|---|
+ | 直前の1回以上の繰り返し | grep -E 'ab+c' f | aとcの間にbが1個以上(abc/abbc) |
| | いずれかに一致(または) | grep -E 'cat|dog' f | catまたはdogを含む行 |
() | グループ化 | grep -E '(ab)+' f | abの1回以上の繰り返し(ab/abab) |
-Eは拡張正規表現を有効にし、-oは一致部分だけを出力します。| 書き方 | 意味 | 例 |
|---|---|---|
grep -E | 拡張正規表現(ERE)を有効にする | grep -E 'cat|dog' f |
grep -o | 一致した部分だけを出力する | grep -o 'cat' f |
正規表現のさらに高度な書き方
grep -P(Perl 互換の正規表現)は GNU grep の拡張です。本講座では基本正規表現(^ $ . * [])と、拡張正規表現を有効にするgrep -E、一致部分だけを出すgrep -oを学びます。これらはどの Linux でも同じ書き方で通用します。
echo -e 'cat\ndog\nfox' > animals.txt # 素材を作成
grep -E 'cat|dog' animals.txt # cat か dog の 2 行
echo -e 'ac\nabc\nabbc' > plus.txt # 素材を作成
grep -E 'ab+c' plus.txt # b が 1 個以上の abc abbc
echo -e 'cat cat dog' > line.txt # 素材を作成
grep -o cat line.txt # 一致した cat を 2 行に分けて出力
コマンドの出力を絞る — | grep
grepは引数のファイルだけでなく、パイプ|で渡された他のコマンドの出力も検索できます。
lsやcatの結果を| grepに通すと、必要な行だけに絞り込めます。
ls cmds | grep '^c'はcmdsディレクトリの一覧からcで始まる名前だけを表示し、cat ファイル | grep 語も同じ形でファイルの中身を絞れます。
|でコマンドの出力をgrepに渡すと、一致した行だけに絞れます。cmdsは自分で作る小さな素材ディレクトリです。mkdir -p cmds # 小さな素材ディレクトリ
touch cmds/cat cmds/cut cmds/sort # 3 つの名前を用意
ls cmds | grep '^c' # 一覧から c で始まる cat と cut
echo -e 'apple\nbanana\ncherry' > fruit.txt # 素材を作成
cat fruit.txt | grep an # an を含む banana だけ
理解度チェック
まずは1問ずつ答えてみましょう。
Q2grep 'ab*c' fの*は何を表しますか?
Q3grep -o cat line.txtを実行すると何が出力されますか?