LinuCレベル1 101試験の例題と解説
1.03.4正規表現を使用したテキストファイルの検索
今回は101試験の試験範囲から、「1.03.4 正規表現を使用したテキストファイルの検索」についての例題を解いてみます。
例題
下記のデータの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
- grep '^user0.*' /etc/passwd
- grep '^user0[2-3].*' /etc/passwd
- grep '/sbin/nologin$' /etc/passwd
- 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のように、一口で正規表現と言っても、拡張された正規表現があったり、コマンドごとに若干の違いが存在します。動きを確かめながら、確実に使えるようにしていきましょう。
例題作成者
株式会社デージーネット ソリューション開発部 森 彰吾 氏