正規表現を利用した検索~grepコマンド・egrepコマンド・fgrepコマンド~
本記事の対象者
LPIC level1習得を目指す初学者の方
コマンドの基本的な用途について、要点を絞って解説します。
今回の内容
今回は、正規表現を利用した検索について解説します。正規表現そのものについては、別記事がありますのでそちらを参照してください。
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が続くものを検索。
このように正規表現を使用してファイル内から該当の行を表示させることができます。
[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」オプションを使用すると、条件に一致する行数のみを表示します。例①の表示結果と比較すると、合致する行数が取得できていることが分かります。
[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」オプションを使用すると、行番号も合わせて表示します。
[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」オプションを使用すると、大文字小文字を区別せずに検索します。
[root@localhost ~]# grep -v [b][c] sample.txt acb ABC BCB
「-v」オプションを使用すると、条件に合致しない行を表示します。
[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の使用方法については同様なので割愛します。
[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」と同様の結果になっているのが分かります。
[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