問題ID3706がわかりません

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2021-12-30 14:41
Pnt353_180  新米   投稿数: 2
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 -E '17:00|59' system.log
grep -E '17:[0-9]+:[0-9]+' system.log
grep -E '17:[0-59]:[0-59]' system.log

回答
grep -E '17:[0-5][0-9]:[0-5][0-9]' system.log
grep -E '17:[0-9]+:[0-9]+' system.log

一つ目が正解なのは分かるのですが、二つ目がなぜ正解なのか分かりません。
+は直前の文字の1回以上の繰り返しなので、二つ目の選択肢だと、例えば17:11:22や17:55:44のようなログ(10の位と1の位がゾロ目のログ)しか抽出されないのではないかと思っているのですがどうでしょうか?
17:46:25のようなログ(10の位と1の位が違う数字のログ)も抽出されるのですか?
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2021-12-30 19:14 | 最終変更
tnishita2  長老   投稿数: 123
抽出されます。[0-9]+ という正規表現で、+ が対象とする直前の文字というのは、1や2の具体的な文字ではなく、[0-9]を指します。「0〜9の任意の一文字」の「1回以上の繰り返し」という動作になります。

ちなみに、17:11:22のようなゾロ目の時刻だけ抽出したい場合、例えば文字を( )でキャプチャして、その文字を\1, \2, ...で参照します。

$ grep -E '17:([0-9])\1:([0-9])\2' system.log

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.