grepのコマンド/運用演習
ログの抽出条件をコマンドへ変換します。入力はLF改行のテキスト、実行環境はGNU grep・LC_ALL=Cとし、行の選択と表示形式を分けて検証します。
この単元で学ぶこと
- grepの検索対象と選択行を説明する
- 固定文字列・正規表現・行全体の一致を使い分ける
- 出力と終了ステータスを別に検証する
本文解説
実習ログの作成 専用ディレクトリにprintf 'INFO start\nERROR disk\nWARN retry\nERROR network\nerror lower\n' > app.logで五行を作ります。大文字小文字、行頭のレベル、メッセージを意図的に変えてあります。grep -n '' app.logで全行へ番号を付け、入力を確認できます。
レベルを正確に指定 grep '^ERROR ' app.logは二行目と四行目を選びます。行頭と末尾の空白を条件に含めることで、メッセージの途中にあるERRORやERRORXのような別語を区別します。grep -iなら小文字errorの五行目も一致します。
複数レベルをまとめる grep -E '^(ERROR|WARN) ' app.logはERROR二行とWARN一行です。括弧を省いて^ERROR|WARNと書くと^がERROR側だけに作用し、WARN側は行中でも一致します。複雑なパターンほど、括弧がどこに効くかを確かめます。
不要な行の除外 grep -v '^INFO ' app.logは残り四行です。これはレベルの重要度を理解しているのではなく、パターンの真偽を反転しています。空行や未知のレベルも条件次第で残るため、除外条件と許可条件のどちらが仕様に合うか判断します。
件数と出現回数 printf 'ERROR ERROR\nINFO\nERROR\n' > count.logではgrep -c 'ERROR' count.logは2です。-oを付けると一致部分ERRORが三行出ます。行に何件のイベントを保存する形式なのかを考えず、-cの値を単語の出現回数と報告しないようにします。
記号を含む設定値 version=1.2をそのまま探すならgrep -F 'version=1.2' settings.txtです。正規表現では.が任意の一文字なのでversion=1x2も一致する場合があります。さらに行全体を限定したいなら-xを追加します。-Fだけでは前後の追加文字を排除しません。
一致なしとエラーを分ける grep -q '^FATAL ' app.logの直後に終了値を保存し、表示がないことだけで結果を判断しません。この既知の読取り可能ファイルでFATALがなければ1です。ファイル名誤りを調べる実験は-qを外して行い、エラーメッセージと終了2を確認します。
境界を試す 空行、同じ行の複数一致、行頭以外のERROR、末尾の空白、大小の違いを一つずつ加えます。パターンは引用してシェルへ意図せず展開させません。実習のASCII範囲を超える文字や別ロケール、別grep実装では改めて動作を確認します。
図解
重要ポイント
- 通常は部分一致した行全体を選ぶ。
- -Fは固定文字列、-Eは拡張正規表現。
- ^と$は行の端、-xは行全体の一致。
- -cは一致行数であり出現回数ではない。
間違えやすい点
- -vを逆順と取り違えない。
- 正規表現の.を常に文字の点だと思わない。
- 終了1の無一致を読取り失敗と混同しない。
- シェルの展開とgrepのパターン解釈を分ける。
用語解説
- パターン
- 検索条件を表す文字列。
- 正規表現
- 文字列の形を記号の規則で表す方法。
- 固定文字列
- 正規表現の特殊な意味を付けずに扱う文字列。
- 選択行
- パターンや反転条件などに従って出力対象となった行。
- 終了ステータス
- コマンドが終了時に返す数値。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。