助け合いフォーラム
LPIC Lv1-101(Ver5.0)
問題ID : 3706
問題を開く
journalctlコマンドの出力結果を保存した「system.log」ファイルがあり、全ての行に「hh:mm:ss」形式で時刻が記録されている。17時台の行を抽出できるコマンドは次のうちどれか。(2つ選択)
正解
grep -E '17:[0-9]+:[0-9]+' system.log
grep -E '17:[0-5][0-9]:[0-5][0-9]' system.log
解説
ファイルや標準入力から、正規表現のパターンにマッチする文字列を含む行を抽出するにはgrepコマンドを利用します。
grepコマンドの書式は以下のとおりです。拡張正規表現を使用する場合は「-E」オプションを使用します。
grep [オプション] 検索パターン [ファイル名]
以下は主な正規表現とその使用例をまとめたものです。

17時台のログは「17:00:00」から「17:59:59」の範囲の時刻です。
選択肢を1つずつ確認します。
・grep -E '17:[0-9]+:[0-9]+' system.log
[0-9]は0~9のいずれかの数字、「+」は直前の文字の1回以上の繰り返しを表します。この場合に「+」で繰り返されるのは[0-9]のため、「hh:mm:ss」形式のファイルでは'17:[0-9][0-9]:[0-9][0-9]'による抽出と同様です。
この選択肢は「17:00:00」から「17:99:99」の範囲を抽出できます。結果として17時台のログは抽出されるので、正しいコマンドです。
・grep -E '17:[0-9]?:[0-9]?' system.log
「?」は直前の文字の0回もしくは1回の繰り返しなので、「17::」や「17:9:9」のような行が抽出の対象です。17時台のログは抽出されませんので、誤りです。
・grep -E '17:[0-59]:[0-59]' system.log
[0-59]は0~5,9のいずれかの数字を表すので、「17:0:0」や「17:2:4」のような行が抽出の対象です。17時台のログは抽出されませんので、誤りです。
・grep -E '17:00|59' system.log
「17:00|59」は「17:00」か「59」のいずれかの文字列が抽出の対象です。17時台のログは抽出されませんので、誤りです。
・grep -E '17:[0-5][0-9]:[0-5][0-9]' system.log
[0-5]は0~5のいずれかの数字、[0-9]は0~9のいずれかの数字を表すので、「17:00:00」から「17:59:59」の範囲を抽出できます。17時台のログは抽出されるので、正しいコマンドです。
したがって正解は
・grep -E '17:[0-9]+:[0-9]+' system.log
・grep -E '17:[0-5][0-9]:[0-5][0-9]' system.log
です。
以下は実行例です。赤い部分がgrepコマンドにマッチした文字列です。
grepコマンドの書式は以下のとおりです。拡張正規表現を使用する場合は「-E」オプションを使用します。
grep [オプション] 検索パターン [ファイル名]
以下は主な正規表現とその使用例をまとめたものです。

17時台のログは「17:00:00」から「17:59:59」の範囲の時刻です。
選択肢を1つずつ確認します。
・grep -E '17:[0-9]+:[0-9]+' system.log
[0-9]は0~9のいずれかの数字、「+」は直前の文字の1回以上の繰り返しを表します。この場合に「+」で繰り返されるのは[0-9]のため、「hh:mm:ss」形式のファイルでは'17:[0-9][0-9]:[0-9][0-9]'による抽出と同様です。
この選択肢は「17:00:00」から「17:99:99」の範囲を抽出できます。結果として17時台のログは抽出されるので、正しいコマンドです。
・grep -E '17:[0-9]?:[0-9]?' system.log
「?」は直前の文字の0回もしくは1回の繰り返しなので、「17::」や「17:9:9」のような行が抽出の対象です。17時台のログは抽出されませんので、誤りです。
・grep -E '17:[0-59]:[0-59]' system.log
[0-59]は0~5,9のいずれかの数字を表すので、「17:0:0」や「17:2:4」のような行が抽出の対象です。17時台のログは抽出されませんので、誤りです。
・grep -E '17:00|59' system.log
「17:00|59」は「17:00」か「59」のいずれかの文字列が抽出の対象です。17時台のログは抽出されませんので、誤りです。
・grep -E '17:[0-5][0-9]:[0-5][0-9]' system.log
[0-5]は0~5のいずれかの数字、[0-9]は0~9のいずれかの数字を表すので、「17:00:00」から「17:59:59」の範囲を抽出できます。17時台のログは抽出されるので、正しいコマンドです。
したがって正解は
・grep -E '17:[0-9]+:[0-9]+' system.log
・grep -E '17:[0-5][0-9]:[0-5][0-9]' system.log
です。
以下は実行例です。赤い部分がgrepコマンドにマッチした文字列です。
参考
【正規表現】
正規表現とは、文字列の特定のパターンを認識するために使用する表現方法です。文字列の検索や置換などを行う際に利用します。
正規表現には基本正規表現と拡張正規表現があります。正規表現には基本正規表現と拡張正規表現があります。拡張正規表現では、特別な意味を持つ記号を基本正規表現よりも多く使用でき、複雑な検索パターンをより簡潔に記述できます。
検索パターンとは、探したい文字列の条件を表したものです。また、検索パターンの条件に当てはまることをマッチ、条件に合う行だけを取り出すことを抽出といいます。
以下は主な正規表現とその使用例をまとめたものです。

なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は、「'」(シングル・クォーテイション)や「"」(ダブル・クォーテイション)で囲めます。囲むと、正規表現の記号がシェルのメタキャラクタとして解釈されなくなります。
正規表現を利用する主なコマンドには「sed」「grep」があります。
■sed
sedは、ファイルや標準入力の内容を編集して表示するコマンドです。
書式と主なオプション・編集コマンドは以下のとおりです。sedコマンドでは、編集コマンドの「s」や「d」などを指定することで置換や削除などを行います。
sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]

例)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
■grep
grepは、ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンドです。
書式と主なオプションは以下のとおりです。
grep [オプション] 検索パターン [ファイル名]

例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。
grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します。
例)拡張正規表現「+」を使った抽出

なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」とすることで拡張正規表現と同様の意味になります。
例)基本正規表現で「+」を扱う場合
正規表現とは、文字列の特定のパターンを認識するために使用する表現方法です。文字列の検索や置換などを行う際に利用します。
正規表現には基本正規表現と拡張正規表現があります。正規表現には基本正規表現と拡張正規表現があります。拡張正規表現では、特別な意味を持つ記号を基本正規表現よりも多く使用でき、複雑な検索パターンをより簡潔に記述できます。
検索パターンとは、探したい文字列の条件を表したものです。また、検索パターンの条件に当てはまることをマッチ、条件に合う行だけを取り出すことを抽出といいます。
以下は主な正規表現とその使用例をまとめたものです。

なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は、「'」(シングル・クォーテイション)や「"」(ダブル・クォーテイション)で囲めます。囲むと、正規表現の記号がシェルのメタキャラクタとして解釈されなくなります。
正規表現を利用する主なコマンドには「sed」「grep」があります。
■sed
sedは、ファイルや標準入力の内容を編集して表示するコマンドです。
書式と主なオプション・編集コマンドは以下のとおりです。sedコマンドでは、編集コマンドの「s」や「d」などを指定することで置換や削除などを行います。
sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]

例)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
■grep
grepは、ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンドです。
書式と主なオプションは以下のとおりです。
grep [オプション] 検索パターン [ファイル名]

例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。
grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します。
例)拡張正規表現「+」を使った抽出

なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」とすることで拡張正規表現と同様の意味になります。
例)基本正規表現で「+」を扱う場合
17時台のログはどう表現するのでしょうか?
投稿日 2022/11/28
以下の解説がよくわかりません。
17時台のログは「17:00:00」から「17:59:59」の範囲の時刻です。
・grep -E '17:[0-59]:[0-59]' system.log
[0-59]は0~5,9のいずれかの数字を表すので、「17:0:0」や「17:2:4」のような行を抽出します。17時台のログは抽出されませんので、誤りです。
この解説で
「17:0:0」や「17:2:4」のような行を抽出します。
としていて、これは17時丁度や17時2分4秒と表現しているから17時台のログは抽出されるのではないのでしょうか?
2022/11/28 19:32
「17:0:0」や「17:2:4」のような行を抽出します。17時台のログは抽出されませんので、誤りです。
をより厳密に詳しく言うと、
「17:0:0」や「17:2:4」のような行を抽出しようとします。しかし17時台の実際のログは「17:00:00」や「17:02:04」であり、抽出されませんので、誤りです。
となります。「解説」の最後に実行例が載っており、先頭の0が省略されていないことを確認できます。
コメント
この投稿に対して返信しませんか?
t tsuyumi_s
2022/11/30 09:45
正式な状態の時間が抽出されないから誤り、ということですね! 解説ありがとうございました。