🎯 この記事で学べること
- 1パイプとリダイレクトの基本概念を理解できます
- 2標準入力・標準出力・標準エラー出力の違いを把握できます
- 3複数のコマンドを効率的に連携させる方法が身につきます
- 4ファイルへの出力保存や追記の使い分けができるようになります
- 5実践的なデータ処理パイプラインを構築できるようになります
読了時間: 約8分
はじめに
こんにちは!今日は Linux の「パイプ」と「リダイレクト」について学びましょう。これらは一見難しそうに聞こえるかもしれませんが、実は水道管をつないだり、水の流れを変えたりするのと同じような概念なんです。
これらの機能を使いこなせると、複雑な処理も簡単に書けるようになり、作業効率が格段に向上しますよ!
パイプとリダイレクトって何?
パイプ | は「つなぐ」
パイプは、あるコマンドの出力を次のコマンドの入力につなげる「配管」のような役割をします。記号は縦棒(|
)を使います。
コマンド1 | コマンド2
これは「コマンド1の結果をコマンド2に渡す」という意味です。まるで工場のベルトコンベアーみたいですね!
リダイレクトは「向きを変える」
リダイレクトは、コマンドの出力先を画面からファイルに変えたり、ファイルの内容をコマンドに入力したりする機能です。
>
: 出力をファイルに保存(上書き)>>
: 出力をファイルに追記<
: ファイルから入力を読み込む
🎮 理解度チェック
リダイレクトの基本をマスターしよう
出力をファイルに保存する >
画面に表示される内容をファイルに保存できます:
$ echo "Hello, World!" > greeting.txt
$ ls -la > file_list.txt
>
は既存のファイルを問答無用で上書きします!大切なファイルを誤って消さないよう注意しましょう。
ファイルに追記する >>
既存のファイルの最後に追加したい場合は >>
を使います:
$ echo "2025-01-08: 今日の作業開始" > log.txt
$ echo "2025-01-08: タスク1完了" >> log.txt
$ echo "2025-01-08: タスク2完了" >> log.txt
日記やログファイルを作るときに便利ですね!
ファイルから入力を読み込む
ファイルの内容をコマンドに渡すことができます:
$ sort < unsorted_names.txt
$ wc -l < document.txt
これは「このファイルの内容を使って処理して」という指示です。
パイプで魔法のような連携を
基本的なパイプの使い方
複数のコマンドを |
でつなげると、流れるような処理ができます:
$ ls -la | grep ".txt"
これは「ファイル一覧を表示して、その中から .txt を含む行だけ抜き出す」という意味です。
パイプの連鎖
3つ以上のコマンドもつなげられます:
$ cat names.txt | sort | uniq
これは「ファイルを表示 → 並び替え → 重複を削除」という流れです。まるで料理のレシピみたい!
標準入出力の3つの流れ
実は、コマンドには3つの「流れ」があるんです:
- 標準入力(stdin): キーボードからの入力
- 標準出力(stdout): 画面への通常の出力
- 標準エラー出力(stderr): エラーメッセージの出力
エラーメッセージを制御する
エラーメッセージだけを別ファイルに保存できます:
# エラーメッセージをファイルに保存
$ command 2> error.log
# エラーメッセージを捨てる(表示しない)
$ command 2> /dev/null
/dev/null
は「ブラックホール」みたいなもので、送られたデータは消えてなくなります。
すべての出力をまとめる
通常の出力もエラーも一緒にファイルに保存:
$ command > output.txt 2>&1
これは「標準出力を output.txt に、エラー出力も同じところに」という意味です。
🎮 理解度チェック
実践的な使用例
ログファイルの解析
アクセスログから特定の情報を抽出:
# 404エラーを起こしたIPアドレスを集計
$ grep " 404 " access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 今日のエラーログだけを見る
$ grep "ERROR" app.log | grep "2025-01-08" | tail -20
システム情報の収集
# メモリを大量に使っているプロセスTOP10
$ ps aux | sort -k4 -nr | head -10
# 80%以上使用しているディスクを警告
$ df -h | awk '$5+0 > 80 {print "警告: " $6 " は " $5 " 使用中"}'
テキストデータの処理
# 文書内の単語を頻度順に表示
$ cat document.txt | tr ' ' '\n' | sort | uniq -c | sort -nr | head -20
# CSVファイルの特定列だけ抽出
$ cut -d',' -f2,3 data.csv | sort
便利な応用テクニック
tee コマンド:画面表示しながら保存
tee
を使うと、画面に表示しながら同時にファイルにも保存できます:
$ ls -la | tee file_list.txt
$ command | tee -a log.txt # -a で追記モード
T字路で水が分岐するイメージですね!
ヒアドキュメント:複数行をまとめて入力
$ cat << EOF > config.txt
server_name=localhost
port=8080
debug=true
EOF
EOF
(End Of File)までの内容をまとめて入力できます。設定ファイルを作るときに便利!
よくある間違いと対処法
無駄な cat の使用
# 非効率
$ cat file.txt | grep pattern
# 効率的
$ grep pattern file.txt
直接ファイルを指定できるコマンドには、わざわざ cat
を使う必要はありません。
パイプラインのデバッグ
複雑なパイプラインがうまく動かないときは、途中経過を確認しましょう:
# 各段階の出力を確認
$ command1 | tee debug1.txt | command2 | tee debug2.txt | command3
🎮 理解度チェック
パイプとリダイレクトのベストプラクティス
可読性を大切に
長いパイプラインは改行で見やすく:
$ cat large_file.txt \
| grep "重要" \
| awk '{print $2, $3}' \
| sort -u \
| head -20
バックスラッシュ(\\
)で改行できます。
安全に作業する
上書き防止の設定:
$ set -o noclobber # 上書き防止モード
$ echo "data" > existing_file.txt # エラーになる
$ echo "data" >| existing_file.txt # 強制的に上書き
エラー処理を忘れずに
$ set -o pipefail # パイプライン内のエラーを検出
$ command1 | command2 | command3
$ echo $? # 終了ステータスを確認(0なら成功)
📝 まとめ
今日はパイプとリダイレクトについて学びました!
- パイプ(
|
)はコマンドをつなげる配管 - リダイレクト(
>
、>>
、<
)は入出力の向きを変える - 標準出力と標準エラー出力は別々に制御できる
tee
で画面表示とファイル保存を同時に実行- 複雑な処理も小さなコマンドの組み合わせで実現可能
最初は |
と >
の基本的な使い方から始めて、徐々に複雑な組み合わせに挑戦していきましょう。実際の作業で使っているうちに、自然と身についていきますよ!
次はgrepコマンドで文字列検索を学んで、パイプと組み合わせた強力な検索技術を身につけませんか?
今日の練習: まずは ls | grep
や echo "Hello" > file.txt
のような簡単な組み合わせから始めてみましょう。慣れてきたら、3つ以上のコマンドをパイプでつなげることに挑戦!