パイプとリダイレクト
このレッスンで分かること
- パイプ
|は左のコマンドの stdout を右のコマンドの stdin に直結します- リダイレクト
>は上書き、>>は追記、<はファイル入力、2>&1で stderr 統合- 最小例は
ls /etc | head -3やecho 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 本の通り道を「つなぎ替える」ための文法です。
動作の図解
図の流れを順序リストで書き直すと、次の通りです。
cat access.logがファイル内容を stdout に流す- パイプ
|でgrep ERRORの stdin につながる grep ERRORが ERROR を含む行だけを stdout に流す- 次の
wc -lの stdin につながる wc -lが行数を計算して stdout に出力- 最終的にターミナル画面に件数が表示される
左から右にデータが流れ、最後の wc -l の結果だけが画面に表示されます。途中のコマンドの出力は次のコマンドの入力に直接流れ込むので、一時ファイルを作る必要がありません。
パイプの基本
パイプ | は、左のコマンドの標準出力を右のコマンドの標準入力に直結します。
ターミナル
$ ls /etc | head -3
adduser.conf
alternatives
aptls の長い一覧を 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 directory2>&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 つができることを確認しましょう。
- パイプとリダイレクト の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. パイプとリダイレクト とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- echo でテストデータを作る
- パイプ | で grep につなぐ
- 'an' を含む行を抽出する