ストリーム・パイプ・リダイレクトのコマンド/運用演習

監視ログから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。
リダイレクト
入出力の接続先をファイルなどへ変更すること。
パイプ
あるコマンドの出力を別コマンドの入力へ接続する仕組み。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。