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

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

このエントリーをはてなブックマークに追加

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

Linucレベル1 101試験 出題範囲


例題

下記のデータの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のように、一口で正規表現と言っても、拡張された正規表現があったり、コマンドごとに若干の違いが存在します。動きを確かめながら、確実に使えるようにしていきましょう。


例題作成者

株式会社デージーネット ソリューション開発部    森 彰吾 氏

ページトップへ