LinuCレベル1 Version 4.0 101試験の例題と解説

103.7 正規表現を使用したテキストファイルの検索

今回は101試験の試験範囲から、「103.7 正規表現を使用したテキストファイルの検索」についての例題を解いてみます。

■トピックの概要
このトピックの内容は以下の通りです。

<103.7 正規表現を使用したテキストファイルの検索>
重要度 2

<説明>
正規表現を使用してファイルおよびテキストデータを操作できる。これには、いくつかの表記要素から成る簡単な正規表現の作成も含まれる。また、正規表現ツールを使用して、ファイルシステムまたはファイルの内容からの検索を実行することも含まれる。

<主要な知識範囲>
・いくつかの表記要素から成る簡単な正規表現を作成する
・正規表現ツールを使用して、ファイルシステムまたはファイルの内容からの検索を実行する

<重要なファイル、用語、ユーティリティ>
grep
egrep
fgrep
sed
regex(7)

■例題
下記のデータの2行目と3行目を検索して出力するコマンドを選択してください。

[/etc/passwd]
user01:1000:1000:user01:/home/user01:/bin/bash
user02:1001:500:user02:/home/user02:/sbin/nologin
user03:1002:500:user03:/home/user03:/bin/bash
user04:1003:500:user04:/home/user04:/sbin/nologin

1. grep '^user0.*' /etc/passwd
2. grep '^user0[2-3].*' /etc/passwd
3. grep '/sbin/nologin$' /etc/passwd
4. grep 'user01|user03' /etc/passwd

※この例題は実際の試験問題とは異なります。


解答と解説

答えは「2. grep '^user0[2-3].*' /etc/passwd'」です。

grepコマンドは、検索キーワードに正規表現を用いることができます。
正規表現は、特殊な文字を使い文字列のパターンを表現するための方法です。
文字列を柔軟に表現できるため、複雑な検索や置換に利用されています。

grepコマンドで利用できる主な正規表現は以下です。

^        …    行頭に一致
$        …    行末に一致
.        …    任意の1文字に一致
*        …    直前の文字・パターンの0回以上に一致
[文字列]    …    文字列の中の1文字どれかが一致
            0-9で0から9までの数字、a-zでアルファベット小文字すべてなどの表現が可能
\{m\}        …    直前の文字・パターンのm回の繰り返しに一致
\{m,\}        …    直前の文字・パターンのm回以上の繰り返しに一致
\{m,n\}        …    直前の文字・パターンのm回以上、n回以下の繰り返しに一致

それぞれの回答の解説は以下の通りです。

1. grep '^user0.*' /etc/passwd

この正規表現は、以下の意味になります。
 
  - 行頭がuser0で始まる
  - user0以降は任意の文字の繰り返し

つまり、行頭がuser0で始まる行がすべてマッチします。
/etc/passwdはすべてuser0から始まっているため、すべての行が
検索対象となり、不正解です。

2. grep '^user0[2-3].*' /etc/passwd

この正規表現は、以下の意味になります。
 
  - 行頭がuser0で始まる
  - user0以降は2から3の数字
  - 上記以降は任意の文字の繰り返し

つまり、行頭がuser02とuser03で始まる行がマッチするため、正解となります。

3. grep '/sbin/nologin$' /etc/passwd

この正規表現は、以下の意味になります。

  - 行末が/sbin/nologinで終わる文字列

/sbin/nologinで終わる行は、2行目と4行目ですので、不正解です。


4. grep 'user01|user03' /etc/passwd

この正規表現は、以下の意味になります。

  - 文字列の中にuser01|user03が含まれる

/etc/passwdの中に、「user01|user03」という文字列を持っている行は無いため、この選択肢も不正解です。

なお|(パイプ)は、egrepやgrep -Eコマンドでは、意味を持ちます。
例えば以下のように実行した場合、「user01またはuser03に一致する」という意味になります。

$ grep -E 'user01|user03' /etc/passwd

正規表現は知識がないと謎の文字の羅列に見えてしまいますが、ひとつひとつの意味を覚えれば、非常に便利なツールです。

ただ一方で問題の4のように、一口で正規表現と言っても、拡張された正規表現があったり、コマンドごとに若干の違いが存在します。動きを確かめながら、確実に使えるようにしていきましょう。

■例題作成者
株式会社デージーネット ソリューション開発部    森 彰吾 氏

ページトップへ