LinuCレベル1 101試験の例題と解説
1.03.4正規表現を使用したテキストファイルの検索
LinuCレベル1 101試験の出題範囲から「1.03.4 正規表現を使用したテキストファイルの検索」についての例題を解いてみます。
ここでは、正規表現の意味と使い方について確認しておきましょう。
例題
ファイルテキスト「test.txt」から、ab2023のように、「英小文字列2文字と数字文字列4文字」で構成されている行だけを検索して出力したい。
正しく出力されるコマンドを選択してください。
- egrep '^[a-z]{2}[0-9]{4}$' test.txt
- grep '^[a-z]{2}[0-9]{4}$' test.txt
- egrep '^[a-z]{2}[0-9]{4}' test.txt
- grep -n '^[a-z]{2}[0-9]{4}' test.txt
※この例題は実際の試験問題とは異なります。
解答と解説
正解は、「1. egrep '^[a-z]{2}[0-9]{4}$' test.txt」です。
grepはファイルから指定した検索パターンにマッチする行を表示するコマンドです。
正規表現を利用して、検索パターンを指定することが可能です。
grepコマンドの書式は以下の通りです。
grep [オプション] パターン [ファイル]
grepコマンドの主なオプションは以下の通りです。
-i | : | 大文字・小文字を区別せずに検索 |
-E | : | 拡張正規表現で検索、egrepコマンドを使用することも可能 |
-v | : | 不一致を検索 |
-n | : | 検索結果に行番号を表示 |
-F | : | 固定文字での検索、fgrepコマンドを使用することも可能 |
-P | : | Perl形式の正規表現で検索 |
grepコマンドで利用できる正規表現と拡張正規表現の一部を紹介します。
正規表現
^ | : | 行頭にマッチ |
$ | : | 行末にマッチ |
. | : | 任意の1文字にマッチ |
* | : | 直前の文字・パターンの0回以上にマッチ |
[ ] | : | カッコ内に含まれる文字のどれかにマッチ []の中には、数字(0-9),アルファベット(a-z,A-Z)などを含めることができます |
[ ]の使い方の例は以下の通りです。
[0-9] | : | 数字の0から9にマッチする行を出力する |
[a-z] | : | 英字のaからzにマッチする行を出力する |
[A-Z] | : | 英字のAからZにマッチする行を出力する |
拡張正規表現
+ | : | 直前の正規表現が1回以上繰り返される |
? | : | 直前の正規表現が0回か1回表れる |
{n} | : | 直前の正規表現をn回繰り返す |
{n,} | : | 直前の正規表現をn回以上繰り返す |
{n,m} | : | 直前の正規表現をn回以上m回以下繰り返す |
選択肢の解説は以下です。
1.egrep '^[a-z]{2}[0-9]{4}$' test.txt
正解です。
実行すると、以下のように出力されます。
$ cat test.txt
aa2023
2023aa
aaaa2023
aa2023aaa
$ egrep '^[a-z]{2}[0-9]{4}$' test.txt
aa2023
egrepコマンドは、"grep -E"と同じ意味合いを持ち、拡張正規表現を使用して検索パターンにマッチする行を表示することができます。
正規表現・拡張正規表現の意味は以下の通りです。
^ | : | 行の先頭を示します。 |
[a-z] | : | 英字のaからzにマッチする行を出力します。 |
{2} | : | 直前の正規表現"[a-z]"を2回繰り返します。 |
[0-9] | : | 数字の0から9にマッチする行を出力します。 |
{4} | : | 直前の正規表現"[0-9]"を4回繰り返します。 |
$ | : | 行の末尾を示します。 |
2.grep '^[a-z]{2}[0-9]{4}$' test.txt
不正解です。
直前の正規表現を繰り返す拡張正規表現"{ }"を使用しています。拡張正規表現を使用して、grepコマンドを実行する場合、オプション-Eが必要となります。
1のように、egrepコマンドを使用することも可能です。
3.egrep '^[a-z]{2}[0-9]{4}' test.txt
不正解です。
実行すると、以下のように出力されます。
$ cat test.txt
aa2023
2023aa
aaa2023
aa2023aaa
$ egrep '^[a-z]{2}[0-9]{4}' test.txt
aa2023
aa2023aaa
行の終わり(行末の指定)を表現していないため、行末に何か文字が続いていてもマッチしてしまいます。aa2023だけを検索する場合には、行の終わりを指定する"$"を使用する必要があります。
4.grep -n '^[a-z]{2}[0-9]{4}' test.txt
不正解です。
2と同様、拡張正規表現を利用して、grepコマンドを実行する場合、-Eオプションを付けるか、または、egrepコマンドを使用する必要があります。さらに、aa2023だけを検索する場合には、行の終わりを指定する"$"を使用する必要があります。
正規表現を利用すると、より簡単にファイル内検索を行うことができます。
正しく理解して利用できるようにしましょう。
例題作成者
株式会社デージーネット OSS研究室 宮本 郁実