パイプ・リダイレクト
Linux コマンドの力が大きく広がるのが、パイプとリダイレクトです。 コマンドの出力を別のコマンドに渡したり、ファイルへ保存したりすることで、複雑な処理を一行で実現できます。
ブラウザでコマンド出力を試す
以下の端末ではコマンドの出力を確認できます。
cat projects/app.log でログファイルの内容を、echo "hello world" でテキスト出力を試してみてください。
実際のターミナルではここで確認した出力をパイプやリダイレクトに渡すことができます。
コマンド出力を確認する
シミュレーターcat や echo で出力を確認してみましょう。実際のターミナルでは | や > を使ってこの出力をさらに加工できます。cat projects/app.log や echo hello などを入力してください。
パイプ(|)で出力を次のコマンドへ渡す
|(パイプ)は、左側のコマンドの出力を右側のコマンドの入力として渡します。
cat app.log | grep "ERROR"
上のコマンドは cat app.log の出力を grep に渡し、ERROR を含む行だけを表示します。
パイプは何段でもつなげられます。
cat app.log | grep "ERROR" | wc -l
wc -l は行数を数えるコマンドです。
ログにエラーが何件あるかを一発で確認できます。
よく使うパイプの組み合わせ
| 組み合わせ | 用途 |
|---|---|
cmd | grep "文字列" | 出力から特定の行を絞り込む |
cmd | sort | 出力を並び替える |
cmd | sort | uniq | 重複を除いて並び替える |
cmd | wc -l | 出力の行数を数える |
cmd | head -20 | 先頭 20 行だけ表示する |
cmd | tail -20 | 末尾 20 行だけ表示する |
cmd | less | 長い出力をスクロールして読む |
リダイレクト(>)で出力をファイルに保存する
> を使うと、コマンドの出力をファイルに書き込めます。
ls -l > filelist.txt
filelist.txt が存在しない場合は新規作成され、存在する場合は上書きされます。
grep "ERROR" app.log > errors.txt
ログを定期的に解析するスクリプトなどでよく使われます。
追記リダイレクト(>>)でファイルに追記する
>> は既存ファイルの末尾に追記します。上書きしたくない場合に使います。
echo "処理完了: $(date)" >> task.log
スクリプトで処理ごとにログを記録していく場面に便利です。
cat server1.log >> all.log
cat server2.log >> all.log
複数のログを一つのファイルに集約する用途にも使えます。
入力リダイレクト(<)でファイルの内容をコマンドへ渡す
< は、ファイルの内容をコマンドの標準入力として渡します。
wc -l < access.log
パイプと似た用途ですが、コマンドによっては引数指定よりも動作が変わる場合があります。
標準エラー出力のリダイレクト(2>)
コマンドの出力には「標準出力(stdout)」と「標準エラー出力(stderr)」の 2 種類があります。
> は標準出力だけを保存し、エラーメッセージは画面に表示されます。
エラーを別ファイルに保存したい場合は 2> を使います。
./script.sh 2> error.log
正常な出力とエラーを別々のファイルに保存するには、次のように書きます。
./script.sh > output.log 2> error.log
標準出力とエラーを同じファイルに保存したい場合は 2>&1 を使います。
./script.sh > all.log 2>&1
2>&1 は「標準エラー出力(2)を標準出力(1)と同じ場所へ向ける」という意味です。
パイプとリダイレクトを組み合わせる
パイプとリダイレクトは一緒に使えます。
grep "ERROR" app.log | sort | uniq > unique_errors.txt
この一行で、ログからエラー行を絞り込み、重複を除いて、ファイルに保存できます。
./long_script.sh | tee output.log
tee は、入力をそのまま画面に表示しつつ、ファイルにも保存する特殊なコマンドです。
長時間かかる処理を画面で見ながら記録したい場面に使えます。
まとめ
|: 出力を次のコマンドに渡す(パイプ)>: 出力をファイルに上書き保存する>>: 出力をファイルに追記する<: ファイルをコマンドの入力に使う2>: エラー出力をファイルに保存する2>&1: エラー出力を標準出力と同じ先に向ける
パイプとリダイレクトを使いこなすと、個別のコマンドを組み合わせて強力な処理を一行で書けるようになります。
grep、sort、wc、head、tail などと合わせて習得すると、ログ解析や日常の作業が大幅に効率化できます。