LinuCレベル1 101試験の例題と解説
主題1.03GNUとUnixのコマンド
1.03.4正規表現を使用したテキストファイルの検索
LinuCレベル1 101試験の出題範囲から「1.03.4 正規表現を使用したテキストファイルの検索」についての例題を解いてみます。
例題
/var/log/messages の中から、行頭が ERROR で始まるログのみを検索したい。
最も適切なコマンドはどれか。
- grep ERROR$ /var/log/messages
- grep '^ERROR' /var/log/messages
- grep 'ERROR.*' /var/log/messages
- grep -F '^ERROR' /var/log/messages
※この例題は実際の試験問題とは異なります。
解答と解説
正解は、「2. grep '^ERROR' /var/log/messages」です。
^ は「行頭」を意味する正規表現のメタ文字です。
そのため、行頭が ERROR で始まる行のみを抽出できます。
例題の選択肢について解説します。
1. grep ERROR$ /var/log/messages
誤りです。
$ は「行末」を表すため、「行末が ERROR の行」を検索してしまいます。
2. grep '^ERROR' /var/log/messages
正しいです。
行頭の ERROR に一致する行のみを検索できます。
3. grep 'ERROR.*' /var/log/messages
誤りです。
ERROR を含む行を検索できますが、「行頭である」条件は入っていません。
4. grep -F '^ERROR' /var/log/messages
誤りです。
-F(固定文字列検索)では ^ が正規表現として扱われず、「文字としての ^」を含む行を検索してしまいます。
正規表現の基本を補足します。
^:行頭/文字列の先頭
^foo → 行が "foo" で始まる。
$:行末/文字列の末尾
bar$ → 行が "bar" で終わる。
.:任意の 1文字(多くの場合改行を除く)
a.b → "a"+任意1文字+"b"(例:acb、a1b)
*:直前の要素が 0回以上 繰り返される
ab*c → "a"+"b"が0回以上+"c"(例:ac、abc、abbc)
[…]:文字クラス=中のどれか 1文字にマッチ
[abc] → "a"または"b"または"c"。範囲指定例:[0-9] → 数字1文字
?:直前の要素が 0回か1回 繰り返される
colou?r → "color" または "colour" にマッチ。(拡張正規表現)
+:直前の要素が 1回以上 繰り返される
ab+c → "a"+"b"が1回以上+"c"(例:abc、abbc)(拡張正規表現)
{n}:直前の要素を ちょうど n 回 繰り返す
\d{5} → ちょうど 5 桁の数字にマッチ。(拡張正規表現)
{n,}:直前の要素を n 回以上 繰り返す
x{3,} → "x"が3回以上連続している部分にマッチ。(拡張正規表現)
{n,m}:直前の要素を n 回以上 m 回以下 繰り返す
o{1,3} → "o"が1回~3回連続している部分にマッチ。(拡張正規表現)
|:左または右のいずれかの式にマッチする
foo | bar → "foo" または "bar" にマッチ(拡張正規表現)
例えば、特定のログファイルから大文字小文字を区別せず err warn fail fatal crit の文字列が含まれる行のみ取り出したい場合は、以下のようなコマンドを実行します。
grep -iE "err|warn|fail|fatal|crit" /path/to/logfileモード指定(Linuxの grep 等での使い分け)を補足します。
- grep -E … 拡張正規表現モード。例えば +(1回以上)、?(0または1回)などが使えるメタ文字が多い。
- grep -F … 固定文字列検索モード。メタ文字を「文字通り」に扱い、正規表現として解釈しない。
- grep -i … パターンとデータにおける大文字小文字の区別を無視する。
grep -F '^ERROR' file.txtと書くと、^ も文字 ^ として扱われるので「行頭で ERROR」にはマッチしません。
例題作成者
株式会社デージーネット 経営企画室 小泉麦