Infra Engineer

正規表現を利用した検索~grepコマンド・egrepコマンド・fgrepコマンド~
2021.11.26
Lv1

正規表現を利用した検索~grepコマンド・egrepコマンド・fgrepコマンド~

本記事の対象者

LPIC level1習得を目指す初学者の方
コマンドの基本的な用途について、要点を絞って解説します。


今回の内容

今回は、正規表現を利用した検索について解説します。正規表現そのものについては、別記事がありますのでそちらを参照してください。

grepコマンド
egrep・fgrepコマンド
まとめ
確認問題

grep

ファイルや標準入力から、正規表現で指定したパターンに一致する行を検索するには、「grep」コマンドを使用します。

grep
意味 指定した検索パターンに合致する文字列を検索する。
書式 grep [オプション] 検索パターン [ファイル名]

grepコマンドのオプションで抑えておくべきものは以下です。

オプション 説明
-c 条件に合致した行の行数のみを表示。
-i 大文字小文字を区別せずに検索。
-n 検索結果と合わせて行番号も表示。
-v 条件に合致しない行を表示。
-E 拡張正規表現を使用。
例①)
オプションなしで使用。
[root@localhost ~]# cat sample.txt
abc
1abc
1abc2
aabbccc
bcb
acb
ABC
BCB

[root@localhost ~]# grep a sample.txt ←①
abc
1abc
1abc2
aabbccc
acb

[root@localhost ~]# grep ^a sample.txt ←②
abc
aabbccc
acb

[root@localhost ~]# grep [ab][c] sample.txt ←③
abc
1abc
1abc2
aabbccc
bcb
acb

「sample.txt」ファイルの中から、①「a」を含むものを検索、②aで始まるものを検索、③aまたはbの後にcが続くものを検索。
このように正規表現を使用してファイル内から該当の行を表示させることができます。

例②)
条件に一致する行数のみを表示。(-c)
[root@localhost ~]# grep -c a sample.txt
5

[root@localhost ~]# grep -c ^a sample.txt
3

[root@localhost ~]# grep -c [ab][c] sample.txt
6

「-c」オプションを使用すると、条件に一致する行数のみを表示します。例①の表示結果と比較すると、合致する行数が取得できていることが分かります。

例③)
検索結果と合わせて行番号も表示。(-n)
[root@localhost ~]# grep -n a sample.txt
1:abc
2:1abc
3:1abc2
4:aabbccc
6:acb

[root@localhost ~]# grep -n ^a sample.txt
1:abc
4:aabbccc
6:acb

[root@localhost ~]# grep -n [ab][c] sample.txt
1:abc
2:1abc
3:1abc2
4:aabbccc
5:bcb
6:acb

「-n」オプションを使用すると、行番号も合わせて表示します。

例④)
大文字小文字を区別せずに検索。(-i)
[root@localhost ~]# grep -i a sample.txt
abc
1abc
1abc2
aabbccc
acb
ABC

[root@localhost ~]# grep -i ^a sample.txt
abc
aabbccc
acb
ABC

[root@localhost ~]# grep -i [ab][c] sample.txt
abc
1abc
1abc2
aabbccc
bcb
acb
ABC
BCB

「-i」オプションを使用すると、大文字小文字を区別せずに検索します。

例⑤)
条件に合致しない行を検索。(-v)
[root@localhost ~]# grep -v [b][c] sample.txt
acb
ABC
BCB

「-v」オプションを使用すると、条件に合致しない行を表示します。

例⑥)
拡張正規表現を使用。(-E)
[root@localhost ~]# grep -E 1?abc sample.txt ←①
abc
1abc
1abc2

[root@localhost ~]# grep -E 1?abc.+ sample.txt ←②
1abc2

[root@localhost ~]# grep -E '2|bc' sample.txt
abc
1abc
1abc2
aabbccc
bcb

「-E」オプションで、拡張正規表現が使用できます。

例⑥)
標準入力から検索する。
[root@localhost ~]# ls
sample.txt  sample2.txt  sample3.csv  sample4.doc

[root@localhost ~]# ls | grep .*.txt
sample.txt
sample2.txt

grepコマンドはファイル内検索で使用することもありますが、標準入力から検索する際にも使用できます。
その際は「|(パイプ)」を使用して、標準入力と連結して使用します。
上の例では「ls」コマンドと連結することで、カレントディレクトリ内の「.txt」で終わるファイルを表示できています。


egrep・fgrep

「egrep」コマンドは、「grep」コマンドで使用できる正規表現に加えて、拡張正規表現も使用することができるコマンドです。(grepの「-E」にほぼ同じ)
「fgrep」コマンドは、正規表現を一切使用できず、条件で指定されるものは、すべて文字列として扱います。(grepの「-F」にほぼ同じ)

egrep
意味 拡張正規表現を使用して検索する。
書式 egrep [オプション] 検索パターン [ファイル名]

※オプション及びfgrepの使用方法については同様なので割愛します。

例①)
「sample2.txt」から「2」の後に「3」が1回以上繰り返す行を検索。
[root@localhost ~]# cat sample2.txt
123
^123
1234
1234$
1233345

[root@localhost ~]# egrep 23+ sample2.txt
123
^123
1234
1234$
1233345

[root@localhost ~]# grep -E  23+ sample2.txt
123
^123
1234
1234$
1233345

「grep -E」と同様の結果になっているのが分かります。

例②)
fgrepの使用例
[root@localhost ~]# grep ^1 sample2.txt
123
1234
1234$
1233345

[root@localhost ~]# grep 4$ sample2.txt
1234

[root@localhost ~]# fgrep ^1 sample2.txt
^123

[root@localhost ~]# fgrep 4$ sample2.txt
1234$

fgrepを使用すると、本来正規表現として使用される表現も、単なる文字列として扱われているのが分かります。


まとめ

今回は、正規表現を使用した検索について解説しました。
grepコマンドは実務でも頻繁に使用することになるコマンドです。
使い方をよく練習しておきましょう。

最後に確認問題で今回学習した内容を是非確かめてください。


確認問題

問題

DD/MM/YYYY:hh:mm:ssという形式のタイムスタンプを持つログファイルsample.logが与えられた場合、午後1時から午後1時59分までの期間のすべてのログを表示するためのコマンドはどれですか?

A) grep –E ‘:13:[09]+:[09]+’ sample.log
B) grep –E ‘:13:[00]+’ sample.log
C) grep –E sample.log ‘:13:[0-9]+:[0-9]+’
D) grep sample.log ‘:13:[0-9]:[0-9]’
E) grep –E ‘:13:[0-9]+:[0-9]+’ sample.log

解答・解説
答え:E

例として「25/11/2021:13:12:35」のような形式でタイムスタンプが保持されているということになります。
ここから問題文の条件に合致する行を抽出したい場合、「:13:12:35」の部分を検索出来ればよいことになります。
「:13」の部分は固定として、残りの「分秒」の部分については「0-9のいずれかの数字の1回以上の繰り返し」で検索可能です。
よって正解はEとなります。