Linuxコマンドラインは、ユーザーにシステムを完全に制御する強力なツールですが、その真のメリットは、パイプとリダイレクトを正しく使用する方法を理解することから生まれます。これらの2つの機能により、コマンドを連結し、出力を非常に柔軟に渡すことができます。

パイプ関数を使用すると、あるコマンドの出力を別のコマンドにルーティングして直接処理できます。また、リダイレクトコマンドを使用すると、結果をファイルに保存したり、エラーや出力の表示方法を変更したりできます。これらのテクニックは、システム管理、ソフトウェア開発、さらには高度な日常的な使用に携わる人にとって不可欠です。
このガイドでは、Linux のパイプとリダイレクトの概念について、わかりやすい実用的な例を挙げて説明します。これにより、より効率的なコマンドを記述し、複雑なタスクを 1 行で実行できるようになります。
まとめ
- Linux コマンドは、入力、出力、およびエラー メッセージに標準のパイプを利用します。
- ディレクティブは、出力ストリームをターミナル ウィンドウではなくファイルに送信します。
- フローを使用すると、コマンドをリンクして、1 つのコマンドの出力を別のコマンドの入力にすることができます。
- Linuxでは、フローとルーティングによってコマンド出力を効率的に利用できます。出力はファイルに保存したり、他のコマンドの入力として使用したりできます。必要な情報を以下に示します。
パイプとは何ですか?
Linuxは、他のUnix系オペレーティングシステムと同様に、フローの概念を取り入れています。各プロセスには、stdinと呼ばれる入力フロー、stdoutと呼ばれる出力フロー、そしてstderrと呼ばれるエラーフローがあります。Linuxでは、現実世界と同様に、フローにはソース(入力)とデスティネーション(出力)という2つのエンドポイントがあります。
入力ストリームはキーボードからコマンドに送られ、情報やコマンドなどのテキストをプロセスに送信できます。出力ストリームはコマンドから送られ、通常はターミナルウィンドウに表示されます。標準エラーストリーム(stderr)もターミナルウィンドウに出力されます。
フローをリダイレクトしたり、フローを介してルーティングしたりできます。リダイレクトとは、出力をターミナルウィンドウ以外の場所に送信することを意味します。フローを介してルーティングとは、あるコマンドの出力を別のコマンドの入力として使用することを意味します。
これにより、コマンドをリンクして、調和して動作する単純なコマンド シーケンスから洗練されたソリューションを作成できます。
フローのリダイレクト
最も単純なリダイレクトは、コマンドの出力をファイルに送信することです。この単純なケースでも、便利な場合があります。コマンド出力のログが必要な場合や、読み取れないほど大量の出力が送信されている場合などです。
このテストコンピュータでは、`du` コマンドは 1380 行のテキストを出力します。このデータをファイルに送信します。
du > disk-usage.txt
ls /home/dave-mckay/ -R >> disk-usage.txt
wc disk-usage.txt
wc disk-usage.txt missing-file.txt > results.txt
wc: missing-file.txt: No such file or directory
cat results.txt

disk-usage.txt ファイルの結果は results.txt ファイルに送信され、missing-file.txt ファイルのエラー メッセージはターミナル ウィンドウに送信されます。
右山括弧に数値インジケータを追加することで、リダイレクト先のパスを指定できます。パス1はstdout、パス2はstderrです。stdoutをあるファイルにリダイレクトし、stderrを別のファイルにリダイレクトすることも簡単です。
wc disk-usage.txt missing-file.txt 1> results.txt 2> error.txt
cat results.txt
cat error.txt
wc disk-usage.txt missing-file.txt 1> results.txt 2>&1
cat results.txt

すべてのエラー メッセージはログに記録され、標準システム出力 (stdout) が送信されるのと同じファイルに送信されます。
出力を一切保存したくない、つまりターミナルウィンドウに何も書き込まないようにしたいだけかもしれません。空のデバイスファイルは、警告なしに送られてきたすべてのデータを消費するため、不要な画面出力を送信するのに便利な保存先となります。
rm disk-usage.txt missing-file.txt 1> /dev/null 2>&1

削除するファイルの 1 つが存在しないにもかかわらず、標準出力 (stdout) メッセージも標準エラー (stderr) メッセージもターミナル ウィンドウに書き込まれません。
リダイレクトで使用できるもう 1 つのトリックは、ファイルをコマンドの標準入力ストリーム (stdin) に読み込むことです。
wc < /etc/passwd
wc < /etc/passwd > results.txt
cat results.txt
出力を経由させる Pipe
戻る Pipe あるコマンドの出力を別のコマンドの入力にルーティングします。ストリームルーティングはコマンドラインの最も強力な機能の1つであり、Linuxのコアコマンドやツールの使い方を変えることができます。
あるコマンドの出力を別のコマンドに渡すには、パイプ記号「|」を使用します。例えば、ホームディレクトリ内のすべてのファイルとサブフォルダを繰り返し表示したい場合、ターミナルウィンドウでlsコマンドの出力のプレビューを簡単に確認できます。
ls コマンドの出力を less コマンドに送ることで、使いやすいファイル ビューアーに結果が表示されます。
ls -R ~ | less

この方法は、出力をファイルに送信してからそれを開くという 2 段階の手動プロセスよりも効率的で、時間もかかりません。
別のコマンドで出力を指示する
ルーティングの利点は、2 番目のコマンドが最初のコマンドの出力を処理するときに明らかになります。
マシン上の実際のユーザーアカウントと偽のユーザーアカウントの数を数えてみましょう。`cat`コマンドを使って`/etc/passwd`ファイルの内容を表示し、`wc`コマンドでそのファイルを調べます。`-l(行数)`オプションは、このファイルの行数をカウントします。アカウントごとに1行なので、自動的にアカウントがカウントされます。
cat /etc/passwd | wc -l
cat /etc/passwd | awk -F: '{print $1}'
cat /etc/passwd | awk -F: '{print $1}' | sort

一連のコマンドを通じて出力を指示する
これは3つのコマンドに接続された4つのコマンドのセットです Pipepsコマンドは実行中のプロセスのリストを表示します。-e(all)オプションはすべてのプロセスを表示し、-o(output)オプションは表示する情報を指定します。commシンボルは、プロセス名のみを表示することを示します。
プロセス名のリストはgrepコマンドに渡され、名前に「chrome」という単語を含むプロセスが除外されます。このフィルタリングされたリストはsortコマンドに渡され、ソートされます。ソートされたリストはuniqコマンドに渡されます。-c(count)オプションは、一意のプロセス名の数をカウントします。デモのために、Firefoxブラウザでも同じ処理を繰り返します。
ps -e -o comm | grep chrome | sort | uniq -c
ps -e -o comm | grep firefox | sort | uniq -c
無数の組み合わせ
Linuxのパイプとリダイレクトをマスターすることで、システム管理における制御性と効率性が新たなレベルに到達します。一見シンプルなこれらのツールは、多くの時間と労力を節約できます。
これらの例を実際にデバイスに適用してみると、簡潔でプロフェッショナルなコマンドを使用して複雑なタスクを実行できることがわかります。




