【パイプ】

パイプ とは?

💡 コマンドとコマンドをつなぐ「水道管」、データが流れて次々と加工される
📌 このページのポイント
パイプ(|)の仕組み $ cat log.txt | grep ERROR | sort | uniq -c cat log.txt 全行を出力 | grep ERROR ERRORだけ抽出 | sort ソート | uniq -c カウント データの流れ INFO: Started ERROR: Timeout INFO: Request OK ERROR: DB fail ERROR: Timeout ERROR: DB fail ERROR: DB fail ERROR: Timeout 1 1
パイプでコマンドをつなげてデータを加工する流れ
ひよこ ひよこ

パイプって「|」のことなの?

ペンギン先生 ペンギン先生

そうだよ!たとえば `ls | grep txt` と書くと、`ls` の出力結果が `grep txt` に渡されて、txtを含む行だけが表示されるんだ。水道管でデータを次のコマンドに流すイメージだね

ひよこ ひよこ

パイプを何個もつなげることもできるの?

ペンギン先生 ペンギン先生

もちろん!`cat access.log | grep ERROR | sort | uniq -c | sort -rn | head` みたいに何段でもつなげられるよ。ログからエラー行を抽出→ソート→重複カウント→多い順に並べ替え→上位を表示、という処理がワンライナーでできるんだ

ひよこ ひよこ

パイプとリダイレクトはどう違うの?

ペンギン先生 ペンギン先生

パイプ(|)は「コマンド→コマンド」にデータを渡す仕組みで、リダイレクト(> や <)は「コマンド→ファイル」または「ファイル→コマンド」にデータを渡す仕組みだよ。パイプは一時ファイルを作らずにメモリ上でデータを受け渡すから効率的なんだ

ひよこ ひよこ

名前付きパイプっていうのもあるの?

ペンギン先生 ペンギン先生

FIFO(First In First Out)とも呼ばれる名前付きパイプは、`mkfifo` コマンドで作れるファイルシステム上の特殊なファイルだよ。普通のパイプは親子関係のあるプロセス間でしか使えないけど、名前付きパイプなら全く関係のないプロセス同士でもデータをやりとりできるんだ

ひよこ ひよこ

パイプの中ではデータはどうなっているの?

ペンギン先生 ペンギン先生

カーネルがメモリ上に小さなバッファLinuxデフォルトは64KB)を確保して、書き込み側と読み込み側をつないでいるんだ。バッファがいっぱいになると書き込み側が一時停止し、空になると読み込み側が一時停止する。この「背圧(バックプレッシャー)」の仕組みがあるから、処理速度が違うコマンド同士でも安全につなげるんだよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「パイプ」って出てきたら「コマンドの出力を次のコマンドの入力につなぐ仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「pipe」 = 管・パイプ
💬 データが水道管(パイプ)を通るようにコマンド間を流れていくことからこの名前がついたよ
← 用語集にもどる