順番に読み進めながら学べます

基本正規表現 — grep で使うパターン

grepの基本正規表現を ^/$/./*/[] の5記号と拡張表現 -E、一致部分だけ出す -o まで、テキストファイルからの抽出で確かめます。

正規表現を試せるツール

本記事のパターンは、ブラウザ上で動く正規表現テスターでも試せます。入力テキストに対して、パターンの一致箇所をその場で確認できます。

基本正規表現 — ^ $ . * []

正規表現は、文字列のパターンを表す書き方です。grepは探す文字列を正規表現として解釈するため、固定文字列だけでなく「行頭がこの文字」「ここに任意の1文字」といった条件で行を探せます。基本正規表現で覚える記号は^$.*[]の5つです。

^は行頭、$は行末を表すアンカーです。.は任意の1文字に一致し、*は直前の文字の0回以上の繰り返しを表します。[abc]は角かっこ内のいずれか1文字、[a-z]は範囲で小文字1文字に一致します。これらを組み合わせて柔軟な検索ができます。

基本正規表現の記号と意味
^ct$c.tc で始まる行t で終わる行c と t の間が任意1文字
^は行頭、$は行末、.は任意の1文字を表します。
記号意味例の意味
^行頭に一致grep '^c' fcで始まる行を探す
$行末に一致grep 't$' ftで終わる行を探す
.任意の1文字に一致grep 'c.t' fctの間が任意1文字(cat/cot
*直前の文字の0回以上の繰り返しgrep 'ab*c' facの間にbが0個以上(ac/abc
[abc]いずれか1文字に一致grep '[cb]at' fcatまたはbatを探す
[a-z]範囲のいずれか1文字に一致grep '[a-z]at' f小文字1文字+atcat/bat
\|いずれかに一致(または)grep 'cat\|dog' fcatまたは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

echo -e 'cat\ncot\ndog' > words.txtで3行の素材ファイルを作成してください。

grepに行頭を表すアンカーを付けたパターンを渡し、cで始まる行だけを表示してください。

③ 続けて、行末を表すアンカーを付けたパターンでtで終わる行を表示してください。

④ さらに、任意の1文字を表す記号を間にはさんだパターンでctの間が1文字の行を表示してください。(正しく実行できれば解説が表示されます)

Linux console
0 / 4 実行済み
Loading Linux Terminal...

繰り返しと文字クラス — * と []

*は直前の文字の0回以上の繰り返しを表します。ab*cacabcabbcのようにbが0個以上ある行に一致します。[]は角かっこ内のいずれか1文字に一致し、[cb]atcatbatの両方を拾います。[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 行

echo -e 'ac\nabc\nabbc\naxc' > rep.txtで繰り返し確認用の素材を作成してください。

grepに直前の文字の0回以上の繰り返しを表す記号を使ったパターンを渡し、acの間にbが何個でもよい行を表示してください。

echo -e 'cat\nbat\nrat' > cls.txtで文字クラス確認用の素材を作成してください。

④ 角かっこの文字クラスを使ったパターンでcatbatだけを表示してください。

Linux console
0 / 4 実行済み
Loading Linux Terminal...

または — \| でいずれかに一致

基本正規表現では|(または)はそのままだと普通の文字として扱われます。

選択を表すにはバックスラッシュを付けて\|と書き、grep 'cat\|dog'catdogを含む行に一致します。

後半で学ぶgrep -Eなら、\|の代わりに|をそのまま書けます。

echo -e 'cat\ndog\nfox' > sel.txt   # 素材を作成
grep 'cat\|dog' sel.txt              # cat か dog を含む 2 行

echo -e 'cat\ndog\nfox' > sel.txtで3行の素材ファイルを作成してください。

② 基本正規表現で「または」を表すには|にバックスラッシュを付けます。grep'cat\|dog'を渡し、catdogを含む行を表示してください。

foxはどちらにも一致しないため出力されないことを確認してください。

Linux console
0 / 2 実行済み
Loading Linux Terminal...

拡張正規表現と一致部分の出力 — grep -E / grep -o

基本正規表現では+ | ( )\+ \| \( \)のようにエスケープが必要ですが、grep -Eならそのまま書けます。grep -Eは拡張正規表現(ERE)を有効にします。基本正規表現ではエスケープが必要だった+(1回以上)や|(または)、()(グループ)を、そのまま書けるようになります。grep -E 'cat|dog'catdogを含む行に一致します。

grep -oは一致した行全体ではなく、一致した部分の文字列だけを出力します。1行に複数の一致があれば、それぞれを別の行として出します。ログから一致箇所だけを取り出して数えたいときに役立ちます。

記号意味例の意味
+直前の1回以上の繰り返しgrep -E 'ab+c' facの間にbが1個以上(abc/abbc
|いずれかに一致(または)grep -E 'cat|dog' fcatまたはdogを含む行
()グループ化grep -E '(ab)+' fabの1回以上の繰り返し(ab/abab
grep -E と grep -o の働き
grep -E 'cat|dog' fcat か dog を含む行grep -o 'cat' f一致した cat だけを出力
-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 行に分けて出力

echo -e 'cat\ndog\nfox' > animals.txtで素材ファイルを作成してください。

grepに拡張正規表現を有効にするオプションを付け、catまたはdogのどちらかを含む行を表示してください。

echo -e 'ac\nabc\nabbc' > plus.txtで素材を作成し、拡張正規表現のgrep -E 'ab+c'bが1個以上ある行を表示してください。

echo -e 'cat cat dog' > line.txtで1行に複数の語が並んだ素材を作成してください。

grepに一致部分だけを出すオプションを付けてcatを検索し、一致した語だけが行ごとに出ることを確認してください。

Linux console
0 / 6 実行済み
Loading Linux Terminal...

コマンドの出力を絞る — | grep

grepは引数のファイルだけでなく、パイプ|で渡された他のコマンドの出力も検索できます。

lscatの結果を| grepに通すと、必要な行だけに絞り込めます。

ls cmds | grep '^c'cmdsディレクトリの一覧からcで始まる名前だけを表示し、cat ファイル | grep 語も同じ形でファイルの中身を絞れます。

| grep でコマンドの出力を絞る
ls cmds全部の一覧が出るls cmds | grep '^c'c で始まる行だけに絞る
|でコマンドの出力を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 だけ

mkdir -p cmdstouch cmds/cat cmds/cut cmds/sortで、小さな素材ディレクトリを用意してください。

ls cmdsの出力をパイプ|grepに渡し、cで始まる名前だけを表示してください。

echo -e 'apple\nbanana\ncherry' > fruit.txtで3行の素材を作成し、cat fruit.txtの出力を| grepに通してanを含む行だけを表示してください。

Linux console
0 / 5 実行済み
Loading Linux Terminal...
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1正規表現で行頭に一致させる記号はどれですか?

Q2grep 'ab*c' f*は何を表しますか?

Q3grep -o cat line.txtを実行すると何が出力されますか?