ストリーム・パイプ・リダイレクトのコマンド/運用演習
監視ログからWARN行だけを集める作業を題材に、入力・中間結果・最終結果・診断の保存先を追います。ファイルが作られたことだけで成功とせず、内容と終了状態を確認します。Bashとgrep、sort、wc、teeを使い、新規の一時ディレクトリ内で実習します。
この単元で学ぶこと
- 標準入力・標準出力・標準エラーの経路を説明できる
- 上書き・追記・パイプを使い分けられる
- リダイレクトの順序による出力先の違いを検証できる
本文解説
要求と入力 入力をINFO boot、WARN cpu、WARN disk、INFO stopの四行とします。求める成果物はWARNで始まる二行を保存したwarningsと、件数2を保存したcountです。診断メッセージはこの件数へ混ぜず、別のerrorsへ保存します。
準備 lesson_dir=$(mktemp -d)を実行し、printf "INFO boot\nWARN cpu\nWARN disk\nINFO stop\n" > "$lesson_dir/events"で入力を作ります。cat "$lesson_dir/events"とwc -l < "$lesson_dir/events"で内容と4行を確認します。入力の確認を省くと、抽出条件が正しくても前提が違う失敗を見逃します。
抽出と保存 grep "^WARN " "$lesson_dir/events" > "$lesson_dir/warnings" 2> "$lesson_dir/errors"を実行します。^は行頭、末尾の空白はWARNの後の区切りなので、WARNINGを誤って同じ分類にしません。warningsにはWARN cpuとWARN disk、errorsは正常なら空です。
件数と中間結果 wc -l < "$lesson_dir/warnings" > "$lesson_dir/count"で件数を保存します。最初からすべてを一本のパイプへつなぐこともできますが、今回は中間ファイルで抽出結果を確認できます。countの数値は2です。wcの表示に先頭空白がある実装でも数値としては同じなので、見た目の文字数と件数を混同しません。
画面でも見る grep "^WARN " "$lesson_dir/events" | tee "$lesson_dir/copy" | wc -lなら、teeの標準出力は画面ではなく次のwcへ入ります。copyには二行、画面には件数2です。teeがあるから常に元の行が端末に表示されるとは限りません。後段との接続先まで追います。
意図的な失敗 実習用の存在しない "$lesson_dir/missing" をgrepの入力にすると診断と非0の終了状態が出ます。2> errorsで診断を保存しても失敗は直りません。grepは「一致なし」の終了状態1と、入力ファイルを読めないなどのエラーを区別するため、空の成果物だけで原因を決め付けません。
順序を変えて観測 sh -c 'printf "DATA\n"; printf "WARN\n" >&2' > "$lesson_dir/merged" 2>&1ならmergedは二行です。同じコマンドの末尾を2>&1 > "$lesson_dir/only-data"にすると、only-dataはDATAの一行でWARNは元の標準出力へ出ます。標準エラーと標準出力の複製は、記号の左から順に接続図を書いて確かめます。
検証と失敗箇所の特定 warningsの行数2、grep -qx "WARN cpu"とgrep -qx "WARN disk"の成功、errorsが空であることをtest ! -sで確認します。grepの確認コマンドの直後の$?が0なら一致しています。一つでも違えば入力→抽出→保存先の順で確認します。パイプラインだけを使う場合は、Bashのpipefailの設定によって途中の失敗を終了状態に反映するかが変わります。
片付けと再実行 作成したファイルを "$lesson_dir/events" のように個別指定してrm --で削除し、空になったディレクトリをrmdir "$lesson_dir"で消します。次の試行では新しいmktemp -dを使用します。実習のリダイレクトを本物のログや設定ファイルに向けず、入力と出力には別の名前を使います。
図解
重要ポイント
- 0は入力、1は結果、2は診断。
- >は置換、>>は追記。
- |は標準出力を次の標準入力へつなぐ。
- 2>&1は実行時点の接続先を複製するため順序が重要。
- 出力内容と終了状態を別々に検証する。
間違えやすい点
- 2>1を2>&1と取り違えない。
- 入力と同じファイルを>の出力先にしない。
- エラー文が消えたことを成功の証拠にしない。
用語解説
- 標準入力
- コマンドが通常データを読み込む入口。番号0。
- 標準出力
- コマンドが通常の結果を出す出口。番号1。
- 標準エラー
- 診断メッセージなどを出す出口。番号2。
- リダイレクト
- 入出力の接続先をファイルなどへ変更すること。
- パイプ
- あるコマンドの出力を別コマンドの入力へ接続する仕組み。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。