Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
|(パイプ)
パイプ(『|』)はあるコマンドの標準出力を、次のコマンドの標準入力に直接渡す仕組みです。複数のコマンドを繋ぐことで複雑な処理をワンライナーで表現できます。Bashのもっとも重要な機能のひとつです。
構文
コマンド1 | コマンド2 | コマンド3 ... # xargs を使ってパイプの出力を引数として渡す コマンド1 | xargs コマンド2
パイプ関連の構文一覧
| 構文 | 概要 |
|---|---|
| cmd1 | cmd2 | cmd1 の標準出力を cmd2 の標準入力に渡します。 |
| cmd1 |& cmd2 | 標準出力と標準エラー出力の両方を cmd2 に渡します(Bash 4以降)。 |
| cmd1 2>&1 | cmd2 | 標準エラー出力も標準出力にまとめて cmd2 に渡します。 |
| cmd1 | tee ファイル | cmd2 | cmd1 の出力をファイルに保存しつつ cmd2 にも渡します。 |
| cmd1 | xargs cmd2 | cmd1 の出力を cmd2 の引数として渡します(改行区切りで引数化)。 |
| cmd1 | xargs -I{} cmd2 {} | プレースホルダー {} に各行を入れて cmd2 を実行します。 |
| ${PIPESTATUS[@]} | パイプ内の各コマンドの終了ステータスを配列で取得します。 |
サンプルコード
以下のファイルを例に説明します。
# fruits.txt の内容 # cherry # apple # banana # apple # cherry
ファイルの行をソートして重複を除きます。『sort』で並べ替えてから『uniq』で連続する重複行を除去します。
cat fruits.txt | sort | uniq
apple banana cherry
『grep』でログファイルからエラー行だけを抽出し、末尾10件を表示します。
grep "ERROR" app.log | tail -10
2026-03-06 09:15:22 ERROR: Connection refused 2026-03-06 09:18:03 ERROR: Timeout exceeded
実行中の nginx プロセスを確認します。『grep -v grep』で grep 自身を除外するのがポイントです。
ps aux | grep nginx | grep -v grep
www-data 1234 0.0 0.2 55840 4096 ? Ss 10:00 0:00 nginx: master www-data 1235 0.0 0.1 55840 2048 ? S 10:00 0:00 nginx: worker
カレントディレクトリのファイル数を数えます。
ls | wc -l
42
ディスク使用量の大きい順にトップ10を表示します。
du -sh * | sort -h | tail -10
標準エラーもパイプに流しつつ、『tee』でログファイルにも保存します。
make 2>&1 | tee build.log | grep -E "error|warning"
『find』で検索したファイルを『xargs』で引数に変換して削除します。
find . -name "*.tmp" | xargs rm
パイプ内の各コマンドの終了ステータスを『${PIPESTATUS[@]}』で確認します。
cat fruits.txt | grep "apple" | wc -l
echo ${PIPESTATUS[@]}
2 0 0 0
概要
パイプは各コマンドを別プロセスで並列に実行するため、非常に効率的です。ただしパイプの中でシェル変数に値を代入しても、パイプ内は別サブシェルで動くため、パイプの外からその変数を参照できません。変数に値を取り込みたい場合はプロセス置換(コマンド置換 『$()』)を使います。
出力をファイルに保存しながら次のコマンドにも渡すには『tee』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。