パイプとリダイレクト

このレッスンで分かること

  • パイプ | は左のコマンドの stdout を右のコマンドの stdin に直結します
  • リダイレクト > は上書き、>> は追記、< はファイル入力、2>&1 で stderr 統合
  • 最小例は ls /etc | head -3echo hello > /tmp/out.txt

パイプとリダイレクト とは

パイプとリダイレクトの操作を学び、コマンド間でのデータの流れを理解しましょう。本レッスンでは、パイプとリダイレクト の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

Linux のコマンドは、一つひとつが小さな部品として設計されています。ls はファイル一覧を表示するだけ、grep は文字列を検索するだけ、wc は行数や単語数を数えるだけ。それぞれが単機能だからこそ、組み合わせることで複雑な処理を表現できます。この「組み合わせ」を可能にする仕組みが、パイプ (|) と リダイレクト (><) です。

たとえばログから ERROR の出現回数を数えるとき、cat access.log | grep ERROR | wc -l と書けば、3 つのコマンドが連携して 1 つの答えを返します。ファイルに結果を残すなら > result.txt を付けるだけ。実務で Linux を使い始めると、この考え方を毎日のように使うことになります。

標準入出力という考え方

Linux の全コマンドは、原則として 3 本のデータの通り道を持っています。

番号名前役割
0標準入力 (stdin)キーボードやファイルから入ってくるデータ
1標準出力 (stdout)正常な結果が流れる出口
2標準エラー (stderr)エラーメッセージが流れる別の出口

パイプとリダイレクトは、この 3 本の通り道を「つなぎ替える」ための文法です。

動作の図解

diagram (will load when visible)

図の流れを順序リストで書き直すと、次の通りです。

  1. cat access.log がファイル内容を stdout に流す
  2. パイプ |grep ERROR の stdin につながる
  3. grep ERROR が ERROR を含む行だけを stdout に流す
  4. 次の wc -l の stdin につながる
  5. wc -l が行数を計算して stdout に出力
  6. 最終的にターミナル画面に件数が表示される

左から右にデータが流れ、最後の wc -l の結果だけが画面に表示されます。途中のコマンドの出力は次のコマンドの入力に直接流れ込むので、一時ファイルを作る必要がありません。

パイプの基本

パイプ | は、左のコマンドの標準出力を右のコマンドの標準入力に直結します。

ターミナル

$ ls /etc | head -3 adduser.conf alternatives apt

ls の長い一覧を head -3 に流し込み、最初の 3 件だけを取り出しています。複数のパイプをつなぐことで処理を段階的に絞り込めます。

ターミナル

$ ps aux | grep nginx | wc -l 4

プロセス一覧から nginx を含む行を抜き出し、その行数を数えています。

パイプは「左側の標準出力」だけを次に渡します。標準エラーは渡らないため、エラーメッセージはターミナルに残ったままになります。エラーも一緒に流したい場合は 2>&1 を使います。

リダイレクトの基本

リダイレクトは、入出力をファイルにつなぎ替えます。

記号意味
>標準出力をファイルに上書き
>>標準出力をファイルに追記
<ファイルから標準入力に流し込む
2>標準エラーをファイルに書き出す
2>&1標準エラーを標準出力と同じ場所へ

ターミナル

$ echo hello > /tmp/out.txt $ cat /tmp/out.txt hello

> は既存ファイルを上書きするため、誤って大事なファイルを消さないよう注意します。追記したいときは >> を使いましょう。

ターミナル

$ echo line1 > /tmp/log.txt $ echo line2 >> /tmp/log.txt $ cat /tmp/log.txt line1 line2

標準エラーの扱い

存在しないファイルを ls で見ると、エラーメッセージは stderr に出ます。stdout だけをリダイレクトしてもエラーはターミナルに残ります。

ターミナル

$ ls /no/such > /tmp/out.txt ls: cannot access '/no/such': No such file or directory $ ls /no/such > /tmp/out.txt 2>&1 $ cat /tmp/out.txt ls: cannot access '/no/such': No such file or directory

2>&1 を付けると、stderr が stdout と同じファイルに流れます。

> は実行した瞬間にファイルを空にしてから書き込みます。cmd > file && mv file other のような操作を組むときは、元ファイルの内容が消える順序に注意してください。

tee で「途中の流れ」を見る

パイプの途中で内容を確認したいときは tee を使います。標準入力をそのまま標準出力に流しつつ、同時にファイルにも書き出してくれます。

ターミナル

$ ls /etc | tee /tmp/etc_list.txt | wc -l 147

ファイル /tmp/etc_list.txt には ls /etc の結果が保存され、画面には wc -l の結果だけが出ます。

やってみよう

下の演習では echo で簡単なリストを作り、パイプで grep に流し、結果を取り出してみましょう。リダイレクトでファイルに保存することも体験できます。

この章のポイント

ここまでの要点 パイプは stdout のみ。stderr を流すなら 2>&1> は上書きで瞬時に空になる、追記は >>tee で途中を覗ける。

まとめ

  • パイプ | は左のコマンドの stdout を右の stdin につなぐ
  • > は上書き、>> は追記、< はファイルを stdin にする
  • 標準エラーは 2>2>&1 で別途扱う
  • 複数のコマンドを組み合わせれば、一時ファイルなしで複雑な処理が書ける

次のレッスン

次は 文字列検索 grep で、テキストの中から目的の行を探し出す方法を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. パイプとリダイレクト の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. パイプとリダイレクト とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. echo でテストデータを作る
  2. パイプ | で grep につなぐ
  3. 'an' を含む行を抽出する

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力