Linuxを整える
中級パイプとリダイレクトを整える。
= `|` や `>` を通るたびデータがどう変わるか、実際に流して見える
パイプとリダイレクトが初めての方は、先に そもそもパイプとリダイレクトとは・どんな場面で使うか をどうぞ。
FD 0 標準入力
stdin
コマンドが読み込む入力。既定はキーボード。< でファイルに差し替え可能。
FD 1 標準出力
stdout
正常な結果の出力先。既定は画面。> >> でファイルへ、| で次のコマンドへ。
FD 2 標準エラー
stderr
エラーメッセージの出力先。既定は画面。パイプ(|)は素通り——普通のパイプは1しか繋がないため、2は流れずそのまま画面に出る。
💡 「パイプで繋いだのにエラーだけ画面に出た」は失敗ではありません。| は既定では標準出力(1)しか次のコマンドに渡さないため、標準エラー(2)は素通りして画面に出るのが正しい動作です。
プリセットを選ぶ
$ cat access.log | grep 404 | wc -l ログの中から「404」を含む行だけ残し、その行数を数える定番の3段パイプ。
STEP 0 / 0
💡 パイプ(|)は「前のコマンドの標準出力(1)を、次のコマンドの標準入力(0)に直結する」だけ。ファイルを介さず、メモリ上でデータを受け渡しているイメージです。
同じコマンドに付け替えてみる
$ myscript.sh 実行中のコマンド
myscript.sh
1=stdout / 2=stderr
🖥️
画面
📄
out.txt
⚠ 2>&1 は「書く順序」で結果が変わる
myscript.sh > out.txt 2>&1
①まず1をout.txtへ ②次に2を「今の1と同じ行き先」に合わせる=2もout.txtへ
→ 標準出力も標準エラーも out.txt に集約される
myscript.sh 2>&1 > out.txt
①まず2を「今の1と同じ行き先」に合わせる=この時点では1はまだ画面なので2も画面へ ②次に1だけout.txtへ切替
→ 標準エラーは画面に残ったまま。out.txtには標準出力しか入らない
💡 2>&1 は「2番を1番の“今の”行き先に合わせろ」というその場のコピー命令。左から右へ順番に処理されるため、書く順序がそのまま結果を左右します。
そもそもパイプとリダイレクトとは
コマンドの出力を、次のコマンドへ・ファイルへつなぐ管。
Linux のコマンドは、文字を受け取り(標準入力)、結果を文字で出し(標準出力)、エラーは別の口(標準エラー出力)に出します。パイプ | は、あるコマンドの出力をそのまま次のコマンドの入力へつなぎます。名前は、水を流す管から来ています。
リダイレクト は、出力の行き先を変える仕組みです。> や >> は画面の代わりにファイルへ、< はファイルの中身を入力として渡します。小さなコマンドを組み合わせて、大きな処理を作る。Linux のコマンドはそういう使い方を前提に作られています。
どこで・どんな場面で使うか
-
ログから必要な行だけ取り出す
grepに出力を流して、ERRORの行だけを見る、といった使い方をします。 -
件数を数える
一覧を
wc -lにつなげば、ファイルや行の数がすぐ分かります。 -
結果をファイルに保存する
>で、コマンドの結果をファイルに残して、あとで見返したり人に渡したりできます。 -
定期実行の結果やエラーを記録する
自動で動かす処理の出力を、ログファイルに書き出して、後から調べられるようにします。
-
並べ替えと重複の除去
sortとuniqをつないで、ファイルの内容を並べ替えて数える、といった集計ができます。
知らないと何が困るか
- ネットで見つけたコマンドが読めない。
|や>が並んだ1行は、意味が分からないと真似するしかなく、直すこともできません。 - エラーが残らず、調査できない。エラーは別の口に出るので、
>だけではファイルに入らないことがあります。違いを知らないと、記録したつもりで空っぽ、ということが起きます。 - 作業が手作業のままになる。つなぎ方を知っていれば、人が目で追っていた作業が1行で済みます。
上のツールで、サンプルデータが | を通るたびにどう変わるか、1段ずつ再生して確かめてみてください。
ありがちな失敗・3つ
繋げる前に、行き先を意識する。
- 1
> のつもりが実は上書き、ログを消してしまう
>は毎回ファイルを空にしてから書き込みます。追記したい時に>を使うと、前回までの内容が消えて気づかない事故になりがちです。追記なら>>。 - 2
パイプで繋げすぎて、後から読めなくなる
grep・sort・uniq・awk・sedを5段も6段も繋ぐと、書いた本人しか追えなくなります。段が増えるほど「途中の出力を一度
teeで確認する」「シェルスクリプトに分けてコメントを書く」判断が要ります。 - 3
2>&1 を先頭に書いてエラーが画面に漏れる
「エラーもファイルにまとめたい」つもりで
2>&1 > out.txtと書くと、標準エラーだけ画面に残ります。まとめたい時は> out.txt 2>&1の順で。
パイプ・リダイレクト・標準入出力/標準エラーの区別は LPIC-1 / LinuC レベル1 の「シェル、シェルスクリプト」領域の頻出テーマです。このページの計算・アニメはすべてあなたのブラウザ内(純JavaScript)で完結し、実際のシェルやファイルシステムには一切アクセスしません(送信ゼロ)。
このツールについて
`|` や `>` を雰囲気で使っていませんか。プリセットのコマンド列を1段ずつ再生して、サンプルデータが grep・sort・uniq・wc・head を通るたびにどう変わるかを目で追い、続けて `>` `>>` `2>` `2>&1` `<` の行き先の違いを図で確認します。実際のシェルは一切呼び出しません(送信ゼロ)。
パイプ`|`は前のコマンドの標準出力(1)を次の標準入力(0)に直結するだけ。`>`は上書き・`>>`は追記。`2>&1`は書く順序で結果が変わる(`> out.txt 2>&1`は集約、`2>&1 > out.txt`はエラーが画面に残る罠)。
🔰 かんたんに言うと
コマンドの結果を次のコマンドへ流す「パイプ(|)」の仕組みを、データが管を流れる図で体験できます。
主な機能
- 4種のプリセットコマンド列(cat|grep|wc、ps aux|grep、ランキング集計、grep二重)をステップ再生(前へ/次へ/自動再生)
- 各段の入力・出力行数と中身をリアルタイム表示
- 同じコマンドに> >> 2> 2>&1 <を付け替え、stdout/stderr/stdinの行き先(画面/ファイル)が切り替わる図
- 2>&1の「書く順序の罠」を2パターン比較で明示
- stdin/stdout/stderrの3本線図をFD番号(0/1/2)つきで常設
- すべてブラウザ内で計算・送信ゼロ
よくある質問
Q. パイプ(|)とは何ですか?
A. あるコマンドの標準出力(1)を、次のコマンドの標準入力(0)にそのまま繋ぐしくみです。ファイルを介さず、メモリ上でデータを受け渡します。例えば `cat access.log | grep 404 | wc -l` は「ログ全体を出す→404を含む行だけ残す→行数を数える」という3段の加工を1行で表現しています。このページの①ではこの絞り込みが1段ずつ進む様子をステップ再生で確認できます。
Q. `>` と `>>` の違いは何ですか?
A. `>` は上書き:出力先のファイルを一度空にしてから書き込みます。既存の内容があれば消えます。`>>` は追記:既存の内容はそのまま残し、末尾に継ぎ足します。ログをためたい場面で `>` を使うと、実行するたびに前回までの記録が消えてしまう事故になりがちです。追記したいなら `>>` を選びます。
Q. `2>&1` はどういう意味で、どこに書けばいいですか?
A. `2>&1` は「標準エラー(2)の行き先を、標準出力(1)の“今の”行き先に合わせろ」というその場のコピー命令です。左から右へ順に処理されるため、書く順序で結果が変わります。`command > out.txt 2>&1` は①1をout.txtへ→②2も(今1が向いているout.txtに合わせて)out.txtへ、で両方out.txtに集約されます。逆に `command 2>&1 > out.txt` は①2を(この時点でまだ画面向きの1に合わせて)画面へ→②1だけout.txtへ切替、となり、標準エラーは画面に残ったままになります。エラーもまとめてファイルに落としたいときは、必ず `> ファイル名 2>&1` の順で書きます。
Q. 標準入力・標準出力・標準エラーとは何ですか?
A. コマンドが持つ3本の入出力です。標準入力(stdin・FD 0)はコマンドが読み込む入力で既定はキーボード。標準出力(stdout・FD 1)は正常な結果の出力先で既定は画面。標準エラー(stderr・FD 2)はエラーメッセージの出力先で、こちらも既定は画面です。パイプ(`|`)は既定では標準出力(1)しか次のコマンドに渡さないため、標準エラー(2)は素通りして画面にそのまま表示されます。これは失敗ではなく正しい動作です。
Q. teeとは何ですか?
A. 画面に表示しつつ、同時にファイルにも保存するコマンドです。`command | tee out.txt` のように使うと、パイプで次の処理に渡す前に、途中経過をファイルへ書き出して確認できます。パイプを何段も繋いで「今どこで期待した結果と違うのか分からない」となったとき、`tee` を挟んで中間出力を覗く、という使い方が定番です。
Q. パイプで繋げすぎると読めなくなりませんか?
A. なります。grep・sort・uniq・awk・sedなどを5段も6段も1行に繋ぐと、書いた本人以外はもちろん、時間が経つと本人にも追えなくなりがちです。対策は、①`tee`で途中経過を一度確認する、②長くなったらシェルスクリプトに分けて各行にコメントを書く、③このページの①のように「1段ずつ何をしているか」を意識しながら組み立てる、の3つです。1行の長さと可読性はトレードオフだと割り切るのがコツです。
Q. このツールは何かを送信しますか?
A. 送信しません。パイプラインのステップ再生もリダイレクトの図解も、すべてこのページを開いたブラウザの中だけで完結する純粋な計算です。サンプルデータはページに固定で埋め込まれた架空のログ・プロセス一覧・名前リストのみを使い、実際のファイルやシェルには一切アクセスしません。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。
続けて整える
この内容は、研修でも扱っています
totonoe.tech を運営する株式会社Koinobori は、法人向けの研修サービス「NOBORIBA®」も運営しています。 ここで手を動かした内容を、講師から教わる形の研修です。このページの道具は無料のまま、登録もいりません。