助け合いフォーラム
正解
grep -E '17:[0-9]+:[0-9]+' system.log
grep -E '17:[0-5][0-9]:[0-5][0-9]' system.log
解説
grepコマンドの書式は以下のとおりです。拡張正規表現を使用する場合は「-E」オプションを使用します。
grep [オプション] 検索パターン [ファイル名]
以下は主な正規表現とその使用例をまとめたものです。
![<img src="/mondai3/img/jpg/k34024.jpg">](https://ping-t-production-strg.s3.ap-northeast-1.amazonaws.com/uploads/question_image/file/1566/k34024.jpg?X-Amz-Expires=600&X-Amz-Date=20240727T040334Z&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAwaDmFwLW5vcnRoZWFzdC0xIkcwRQIgN5H5N4L0yZQgo1s0w6T3VBLXwuRvKHKwzEBTWW6J6lYCIQDz1cQHe%2BIS%2FbZVEBzVWjzO88j1g5KFRIxyjF0KiulTsCqxBAjl%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYyMzQyOTgyNzI3NSIMHAcI%2FoodJnqGVEpiKoUEFKT5Ph379HAYWlmgQnKmUN2VU7VR%2F1K40HMBpvW3sW76xL%2FHVWFqbntponKerBBV3KFI56BjIAtwbhn7IJcgwSBjtMpV178NBZ5RGo0GEoIzFLAxzc5HIS3tvxc4GzLq2riBblG3e8X4rXjCp9rqPDZRQPgpI9b9VPWItTp0GO%2BSjdcF2131f3kbDC4%2BVNsYkp%2BCwtIn26UHJCPQ%2B1DUl2UiWM2LSm07lA%2Ba1oETgu9Z9hUf2xjiOgaYJH3IJI%2F04FM2pzpVbdL659JWdE0LmDh%2BUa5xlXdiLCG1S0v7VmJaSRtoHIBQkICZu%2BXjxDm7F%2BoDusBMfIvJdxIlgF6Shdn21WOrOyENtrtLXNpAZCHphITyFP435HUWpzdPlwcIikr0WcsduRHskia25JSDv0nCL5XNskqHNAYv6v6HBj1DMyXl4HxD5jMpW8VqytKffNSAltiDP1uPswT4iJ2Fgi8XJTGZS0lcOE3cUkhaSISkJImYQM5vBov7c6u%2Ff4G4Pe0vpiZk3TKl1DB5EIF2MY%2BtLyu2MQ47J97bh3Qow5%2FH8U8pyGsD9TRcm6%2FZxB71hLO6IQvSZZjgxWiZpkrtdv0IhROs5Y8Px87dERTQssNayS9WqA8yxX4JiG2oX5mJBib7MYLs2pE%2BgcqXG682G5Zi8qVRPXuH48ESFzcDxVD%2BJJ8TtjD72JG1BjqmAe%2FzdA18epn5AfP5HyUg2lO88tk39YuBerlSgASUV%2FCZbnonlptY6jvikwRES5OJR8OHwOH5PsD%2BHek4xL2RWaJnCVy5YoXkR%2FCEH%2FdDMCQk%2Bgbw1O7I6kzss7MwzZjqTC%2F%2FLGrwjw%2B7kIJ6BXjwNDuk1gUnZTkLJB%2Fywx3uENLJDW5x5dd3fiTexEqN41iEN8cG4PUGvqr8mmcS50mjvSxWmu3JRzc%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAZCJ2QHLF4QV2EIXF%2F20240727%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=25d4ff685a6fde880704babc59aa94ffd27804a4bcf8b1b2f6abed630012bbdf)
17時台のログは「17:00:00」から「17:59:59」の範囲の時刻です。
選択肢を1つずつ確認します。
・grep -E '17:[0-9]+:[0-9]+' system.log
[0-9]は0~9のいずれかの数字を表し、「+」は直前の文字の1回以上の繰り返しなので、「17:0:0」から「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コマンドにマッチした文字列です。
![【図を表示】](https://ping-t-production-strg.s3.ap-northeast-1.amazonaws.com/uploads/question_image/file/1905/k35872.jpg?X-Amz-Expires=600&X-Amz-Date=20240727T040334Z&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAwaDmFwLW5vcnRoZWFzdC0xIkcwRQIgN5H5N4L0yZQgo1s0w6T3VBLXwuRvKHKwzEBTWW6J6lYCIQDz1cQHe%2BIS%2FbZVEBzVWjzO88j1g5KFRIxyjF0KiulTsCqxBAjl%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYyMzQyOTgyNzI3NSIMHAcI%2FoodJnqGVEpiKoUEFKT5Ph379HAYWlmgQnKmUN2VU7VR%2F1K40HMBpvW3sW76xL%2FHVWFqbntponKerBBV3KFI56BjIAtwbhn7IJcgwSBjtMpV178NBZ5RGo0GEoIzFLAxzc5HIS3tvxc4GzLq2riBblG3e8X4rXjCp9rqPDZRQPgpI9b9VPWItTp0GO%2BSjdcF2131f3kbDC4%2BVNsYkp%2BCwtIn26UHJCPQ%2B1DUl2UiWM2LSm07lA%2Ba1oETgu9Z9hUf2xjiOgaYJH3IJI%2F04FM2pzpVbdL659JWdE0LmDh%2BUa5xlXdiLCG1S0v7VmJaSRtoHIBQkICZu%2BXjxDm7F%2BoDusBMfIvJdxIlgF6Shdn21WOrOyENtrtLXNpAZCHphITyFP435HUWpzdPlwcIikr0WcsduRHskia25JSDv0nCL5XNskqHNAYv6v6HBj1DMyXl4HxD5jMpW8VqytKffNSAltiDP1uPswT4iJ2Fgi8XJTGZS0lcOE3cUkhaSISkJImYQM5vBov7c6u%2Ff4G4Pe0vpiZk3TKl1DB5EIF2MY%2BtLyu2MQ47J97bh3Qow5%2FH8U8pyGsD9TRcm6%2FZxB71hLO6IQvSZZjgxWiZpkrtdv0IhROs5Y8Px87dERTQssNayS9WqA8yxX4JiG2oX5mJBib7MYLs2pE%2BgcqXG682G5Zi8qVRPXuH48ESFzcDxVD%2BJJ8TtjD72JG1BjqmAe%2FzdA18epn5AfP5HyUg2lO88tk39YuBerlSgASUV%2FCZbnonlptY6jvikwRES5OJR8OHwOH5PsD%2BHek4xL2RWaJnCVy5YoXkR%2FCEH%2FdDMCQk%2Bgbw1O7I6kzss7MwzZjqTC%2F%2FLGrwjw%2B7kIJ6BXjwNDuk1gUnZTkLJB%2Fywx3uENLJDW5x5dd3fiTexEqN41iEN8cG4PUGvqr8mmcS50mjvSxWmu3JRzc%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAZCJ2QHLF4QV2EIXF%2F20240727%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=c768610336c9397d2d4b903747e8e45637d58f5f43d75c06e0ced81f8cc0581e)
参考
以下は主な正規表現とその使用例をまとめたものです。
![【図を表示】](https://ping-t-production-strg.s3.ap-northeast-1.amazonaws.com/uploads/question_image/file/1566/k34024.jpg?X-Amz-Expires=600&X-Amz-Date=20240727T040334Z&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAwaDmFwLW5vcnRoZWFzdC0xIkcwRQIgN5H5N4L0yZQgo1s0w6T3VBLXwuRvKHKwzEBTWW6J6lYCIQDz1cQHe%2BIS%2FbZVEBzVWjzO88j1g5KFRIxyjF0KiulTsCqxBAjl%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYyMzQyOTgyNzI3NSIMHAcI%2FoodJnqGVEpiKoUEFKT5Ph379HAYWlmgQnKmUN2VU7VR%2F1K40HMBpvW3sW76xL%2FHVWFqbntponKerBBV3KFI56BjIAtwbhn7IJcgwSBjtMpV178NBZ5RGo0GEoIzFLAxzc5HIS3tvxc4GzLq2riBblG3e8X4rXjCp9rqPDZRQPgpI9b9VPWItTp0GO%2BSjdcF2131f3kbDC4%2BVNsYkp%2BCwtIn26UHJCPQ%2B1DUl2UiWM2LSm07lA%2Ba1oETgu9Z9hUf2xjiOgaYJH3IJI%2F04FM2pzpVbdL659JWdE0LmDh%2BUa5xlXdiLCG1S0v7VmJaSRtoHIBQkICZu%2BXjxDm7F%2BoDusBMfIvJdxIlgF6Shdn21WOrOyENtrtLXNpAZCHphITyFP435HUWpzdPlwcIikr0WcsduRHskia25JSDv0nCL5XNskqHNAYv6v6HBj1DMyXl4HxD5jMpW8VqytKffNSAltiDP1uPswT4iJ2Fgi8XJTGZS0lcOE3cUkhaSISkJImYQM5vBov7c6u%2Ff4G4Pe0vpiZk3TKl1DB5EIF2MY%2BtLyu2MQ47J97bh3Qow5%2FH8U8pyGsD9TRcm6%2FZxB71hLO6IQvSZZjgxWiZpkrtdv0IhROs5Y8Px87dERTQssNayS9WqA8yxX4JiG2oX5mJBib7MYLs2pE%2BgcqXG682G5Zi8qVRPXuH48ESFzcDxVD%2BJJ8TtjD72JG1BjqmAe%2FzdA18epn5AfP5HyUg2lO88tk39YuBerlSgASUV%2FCZbnonlptY6jvikwRES5OJR8OHwOH5PsD%2BHek4xL2RWaJnCVy5YoXkR%2FCEH%2FdDMCQk%2Bgbw1O7I6kzss7MwzZjqTC%2F%2FLGrwjw%2B7kIJ6BXjwNDuk1gUnZTkLJB%2Fywx3uENLJDW5x5dd3fiTexEqN41iEN8cG4PUGvqr8mmcS50mjvSxWmu3JRzc%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAZCJ2QHLF4QV2EIXF%2F20240727%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=25d4ff685a6fde880704babc59aa94ffd27804a4bcf8b1b2f6abed630012bbdf)
正規表現には次のような基本の概念があります。
・特殊文字
「|」や「\(エスケープ文字)」などのように特殊な意味を持つ文字のことです。
・文字クラス
「[ ]」内の文字集合のことです。
・数量詞
「*」や「+」などのように直前の文字の繰り返し回数を示す文字のことです。
・アンカー
「^」や「$」などのように文字列内での位置を示す文字のことです。
なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドは以下のとおりです。
・grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
なお、「-E」オプションを併用すると拡張正規表現が使えます(egrepコマンドと同様)。
・sed
ファイルや標準入力の内容を編集して表示するコマンド
例1)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
例2)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
基本正規表現と拡張正規表現の違いに注意してください。grepコマンドは、-Eオプションを付けないと検索パターンを基本正規表現と判断しますので、上表の拡張正規表現が使えません。
実行例)
![【図を表示2】](https://ping-t-production-strg.s3.ap-northeast-1.amazonaws.com/uploads/question_image/file/1567/kk34024.jpg?X-Amz-Expires=600&X-Amz-Date=20240727T040334Z&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAwaDmFwLW5vcnRoZWFzdC0xIkcwRQIgN5H5N4L0yZQgo1s0w6T3VBLXwuRvKHKwzEBTWW6J6lYCIQDz1cQHe%2BIS%2FbZVEBzVWjzO88j1g5KFRIxyjF0KiulTsCqxBAjl%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYyMzQyOTgyNzI3NSIMHAcI%2FoodJnqGVEpiKoUEFKT5Ph379HAYWlmgQnKmUN2VU7VR%2F1K40HMBpvW3sW76xL%2FHVWFqbntponKerBBV3KFI56BjIAtwbhn7IJcgwSBjtMpV178NBZ5RGo0GEoIzFLAxzc5HIS3tvxc4GzLq2riBblG3e8X4rXjCp9rqPDZRQPgpI9b9VPWItTp0GO%2BSjdcF2131f3kbDC4%2BVNsYkp%2BCwtIn26UHJCPQ%2B1DUl2UiWM2LSm07lA%2Ba1oETgu9Z9hUf2xjiOgaYJH3IJI%2F04FM2pzpVbdL659JWdE0LmDh%2BUa5xlXdiLCG1S0v7VmJaSRtoHIBQkICZu%2BXjxDm7F%2BoDusBMfIvJdxIlgF6Shdn21WOrOyENtrtLXNpAZCHphITyFP435HUWpzdPlwcIikr0WcsduRHskia25JSDv0nCL5XNskqHNAYv6v6HBj1DMyXl4HxD5jMpW8VqytKffNSAltiDP1uPswT4iJ2Fgi8XJTGZS0lcOE3cUkhaSISkJImYQM5vBov7c6u%2Ff4G4Pe0vpiZk3TKl1DB5EIF2MY%2BtLyu2MQ47J97bh3Qow5%2FH8U8pyGsD9TRcm6%2FZxB71hLO6IQvSZZjgxWiZpkrtdv0IhROs5Y8Px87dERTQssNayS9WqA8yxX4JiG2oX5mJBib7MYLs2pE%2BgcqXG682G5Zi8qVRPXuH48ESFzcDxVD%2BJJ8TtjD72JG1BjqmAe%2FzdA18epn5AfP5HyUg2lO88tk39YuBerlSgASUV%2FCZbnonlptY6jvikwRES5OJR8OHwOH5PsD%2BHek4xL2RWaJnCVy5YoXkR%2FCEH%2FdDMCQk%2Bgbw1O7I6kzss7MwzZjqTC%2F%2FLGrwjw%2B7kIJ6BXjwNDuk1gUnZTkLJB%2Fywx3uENLJDW5x5dd3fiTexEqN41iEN8cG4PUGvqr8mmcS50mjvSxWmu3JRzc%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAZCJ2QHLF4QV2EIXF%2F20240727%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=721aa6bd6961004ef7e711b4c24af7d60b1c67d1544924ad62fe05f91bebba3b)
基本正規表現では「?, +」は「\?, \+」とすることで、拡張正規表現と同様の意味を持つようになります。
![【図を表示3】](https://ping-t-production-strg.s3.ap-northeast-1.amazonaws.com/uploads/question_image/file/1568/kkk34024.jpg?X-Amz-Expires=600&X-Amz-Date=20240727T040334Z&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAwaDmFwLW5vcnRoZWFzdC0xIkcwRQIgN5H5N4L0yZQgo1s0w6T3VBLXwuRvKHKwzEBTWW6J6lYCIQDz1cQHe%2BIS%2FbZVEBzVWjzO88j1g5KFRIxyjF0KiulTsCqxBAjl%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYyMzQyOTgyNzI3NSIMHAcI%2FoodJnqGVEpiKoUEFKT5Ph379HAYWlmgQnKmUN2VU7VR%2F1K40HMBpvW3sW76xL%2FHVWFqbntponKerBBV3KFI56BjIAtwbhn7IJcgwSBjtMpV178NBZ5RGo0GEoIzFLAxzc5HIS3tvxc4GzLq2riBblG3e8X4rXjCp9rqPDZRQPgpI9b9VPWItTp0GO%2BSjdcF2131f3kbDC4%2BVNsYkp%2BCwtIn26UHJCPQ%2B1DUl2UiWM2LSm07lA%2Ba1oETgu9Z9hUf2xjiOgaYJH3IJI%2F04FM2pzpVbdL659JWdE0LmDh%2BUa5xlXdiLCG1S0v7VmJaSRtoHIBQkICZu%2BXjxDm7F%2BoDusBMfIvJdxIlgF6Shdn21WOrOyENtrtLXNpAZCHphITyFP435HUWpzdPlwcIikr0WcsduRHskia25JSDv0nCL5XNskqHNAYv6v6HBj1DMyXl4HxD5jMpW8VqytKffNSAltiDP1uPswT4iJ2Fgi8XJTGZS0lcOE3cUkhaSISkJImYQM5vBov7c6u%2Ff4G4Pe0vpiZk3TKl1DB5EIF2MY%2BtLyu2MQ47J97bh3Qow5%2FH8U8pyGsD9TRcm6%2FZxB71hLO6IQvSZZjgxWiZpkrtdv0IhROs5Y8Px87dERTQssNayS9WqA8yxX4JiG2oX5mJBib7MYLs2pE%2BgcqXG682G5Zi8qVRPXuH48ESFzcDxVD%2BJJ8TtjD72JG1BjqmAe%2FzdA18epn5AfP5HyUg2lO88tk39YuBerlSgASUV%2FCZbnonlptY6jvikwRES5OJR8OHwOH5PsD%2BHek4xL2RWaJnCVy5YoXkR%2FCEH%2FdDMCQk%2Bgbw1O7I6kzss7MwzZjqTC%2F%2FLGrwjw%2B7kIJ6BXjwNDuk1gUnZTkLJB%2Fywx3uENLJDW5x5dd3fiTexEqN41iEN8cG4PUGvqr8mmcS50mjvSxWmu3JRzc%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAZCJ2QHLF4QV2EIXF%2F20240727%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=000f4ef56cb87eeb3e9445c4348d91c6fa948fc92d034ddbcc5f25dbd6d76955)
grepとgrep -Eまたはegrepの使い分けについて
この問題の正答は、以下とされています。
①grep -E '17:[0-5][0-9]:[0-5][0-9]' system.log
②grep -E '17:[0-9]+:[0-9]+' system.log
①は、拡張正規表現が使用されていないので、-Eがなくてもよい
のに対して、②は、拡張正規表現が使用されているため
-Eをつけるかegrepを使用しなければならない認識です。
ということは、常に -E付き または egrepを使えば
拡張正規表現が含まれる場合も、含まれない場合も対応できる
ので、 -E/egrepのみを使用するほうが拡張正規表現で
失敗するリスクがないのでよいと考えられる様に感じました。
上記は必ずしもそうではなく、-E/egrepではなく
grepを使用しなければならないケースが存在するのでしょうか。
あるいは、機能的には上記でよいが、-E/egrepの方が
処理速度が遅い、多くのリソースを必要とするなど
なんらかのデメリットがあるのでしょうか。
ご存じの方がおられましたら、教えて下さい。
宜しくお願いします。
ここはぶっちゃけていうと「好きに使ったらいい」って話になるかなと思います。
判断基準というのも変ですが、例えば
- 通常の
grep
(BER)では表現が難しい検索文字列を使う必要がある場合ならegrep / grep -E
を使うべき - 特に考えず、ただ文字列をヒットさせたいだけなら
grep
で十分 - あとは好みや「入力文字数」(
grep
なら4文字ですが、egrep
は5文字、grep -E
だと7文字)
なんかでいいんじゃないかなと思います。
ちなみに速度についてはあまり気にしたことないですが、単純な文字の検索程度なら確かにgrep
の方が速いのかもしれませんね。Linuxカーネル6.4.6のソース全体に対してkprint
という文字列を検索しただけですが、何回か実行してもgrep
に比べてegrep / grep -E
の方が数秒遅かったです。
# time grep -r "kprint" * | wc -l
1
real 1m11.317s
user 0m2.010s
sys 0m4.708s
# time egrep -r "kprint" * | wc -l
1
real 1m18.934s
user 0m1.952s
sys 0m4.645s
# time grep -E -r "kprint" * | wc -l
1
real 1m14.637s
user 0m1.943s
sys 0m4.474s
コメント
この投稿に対して返信しませんか?
k kz5835
2023/07/27 00:15
arashi1977様 ご回答、有難うございます。大変参考になりました。