Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Linuxターミナルをマスターしよう:パイプとリダイレクト徹底ガイド

Linuxのコマンドラインインターフェース(CLI)は、システム上でさまざまなタスクを実行できる強力な手段です。Linuxはその歴史的な背景から、ターミナルに数多くの便利な機能が組み込まれています。

その中でも特に強力なのが「パイプ」と「リダイレクト」です。これらの機能を使いこなせるようになると、コマンドの出力や入力を他のコマンドやファイルへ柔軟に振り分けられるようになり、作業効率が大きく向上します。

この記事では、Linuxにおけるパイプとリダイレクトの意味を解説したうえで、実際に自分で使えるようになるための具体的な方法を詳しく掘り下げていきます。

前提知識

このガイドの内容を十分に理解するには、少なくとも以下の準備が必要です。

  • Linuxオペレーティングシステムに関する基礎的な知識
  • Linuxコマンドラインでの基本的な操作経験
  • コマンドを実際に試せるLinuxコマンドライン環境

初めての方や基礎を復習したい方は、先にLinuxコマンドラインの入門チュートリアルを確認しておくとスムーズに読み進められます。

Linuxにおけるパイプとは?

具体的な使い方に入る前に、「パイプ」とは何かを確認しましょう。パイプとは、あるLinuxコマンドの出力を、別のコマンドの入力として渡すことを指します。標準出力や標準エラー出力を、あるコマンドから別のコマンドへ送ることが可能です。

パイプのシンプルな例としては、あるコマンドの出力を取り出し、それを別のコマンドの入力として利用するケースが挙げられます。これを実現するのが、パイプ記号「|」というメタ文字です。

メタ文字という言葉に馴染みがない方のために補足すると、これはコマンドラインにおいて特別な意味を持つ文字のことです。パイプ(|)のほかにも、小なり(<)、大なり(>)、アンパサンド(&)などが代表例として挙げられます。

パイプの基本構文

パイプの基本構文は以下のとおりです。

command1 | command2 | command3 | ... | commandN

上記の構文では、ターミナルは左から右へ順番にコマンドを実行します。まずcommand1が実行され、その出力がcommand2の入力になります。さらにcommand2の出力がcommand3の入力となり、以降も同じ要領で処理が続きます。パイプの魅力は、つなぎたいコマンドの数に事実上限りがない点です。

パイプの使用例

ここからは、パイプを使ってさまざまなタスクを実行する具体例を紹介します。

1. ファイルとディレクトリの数を数える

ls -l | wc -l

この例では、前半部分のlsコマンドがカレントディレクトリ内のすべてのファイルとディレクトリを一覧表示します。「-l」オプションを付けると、詳細情報を含む一覧形式で出力されます。

次に、ls -lの出力がパイプで後段へ渡されます。後段のwc -lコマンドは、受け取った出力の行数を数え、その結果をターミナルに表示します。

2. ファイルやディレクトリの一覧を並べ替える

ls | sort

このコマンドでは、lsコマンドがカレントディレクトリ内のファイルとディレクトリの一覧を出力します。その一覧はsortコマンドへパイプされ、アルファベット順に並べ替えた結果がターミナルに表示されます。

3. ファイル内の単語を並べ替えて重複を除外する

cat words.txt | sort -r | uniq

3つ目の例は、2つのパイプでつながった3つのコマンドから構成されています。最初のcatコマンドは、単語リストを含むwords.txtファイルの中身を出力します。

その出力はsort -rコマンドへ渡され、単語が逆アルファベット順に並べ替えられます。最後に、並べ替え済みの単語がuniqコマンドへ渡され、重複が取り除かれた一意の単語だけが出力されます。

パイプはいつ・なぜ使うべきか

パイプを使いこなすには、構文を覚えるだけでは不十分です。構文自体は非常にシンプルですが、効果的に活用するにはその本質を理解することが大切です。

パイプの目的は、あるコマンドの出力を別のコマンドの入力として利用することで、複数のコマンドをつなぎ合わせることにあります。

一方で、関連性のないコマンドを単純に順番に実行したい場合には、パイプは適していません。そのようなときは、セミコロン(;)で区切って次の構文を使いましょう。

command1 ; command2 ; ... ; commandN

Linuxにおけるリダイレクトとは?

リダイレクトとは、コマンドの入力や出力の行き先を指定することです。デフォルトでは、コマンドは標準入力からデータを受け取り、処理結果を標準出力へ出力します。

リダイレクトが特に役立つのは、コマンドとファイルを組み合わせて作業するときです。たとえば、コマンドの出力をターミナルに表示する代わりにファイルへ書き込んだり、逆に特定のファイルをコマンドの入力として指定したりできます。

パイプと同様に、Linuxにはリダイレクトを行うための特殊な記号が用意されています。以下は、主要なファイルリダイレクト用の記号とその役割の一覧です。

  • > — コマンドの出力を指定したファイルへ書き込む
  • < — 指定したファイルの内容をコマンドの入力として渡す
  • >> — コマンドの出力を指定したファイルへ書き込む。ファイルが存在して内容がある場合は追記する
  • 2> — コマンドのエラーメッセージを指定したファイルへ書き込む
  • 2>> — コマンドのエラーメッセージを指定したファイルへ書き込む。ファイルが存在して内容がある場合は追記する
  • &> — 標準出力と標準エラーの両方を指定したファイルへ書き込む
  • &>> — 標準出力と標準エラーの両方を指定したファイルへ書き込む。ファイルが存在して内容がある場合は追記する

それでは、各リダイレクト記号を順番に詳しく見ていきましょう。

1. 「>」による出力リダイレクト

>記号を使うと、コマンドの出力を特定のファイルへリダイレクトできます。既存のファイルへの書き込みも可能で、ファイルが存在しない場合は自動的に新規作成されます。

ただし、既存のファイルへ書き込む際には注意が必要です。警告なしに元の内容が上書きされてしまうからです。

出力リダイレクトは次の構文で行います。

command > file

commandの実行結果は、標準出力(つまりターミナルへの表示)ではなくfileへ書き込まれます。具体的な例を示します。

ls -a > contents.txt

このコマンドでは、カレントディレクトリ内の項目(ドットファイル、ディレクトリ、ファイルなど)の一覧がcontents.txtファイルへ書き込まれます。リダイレクトされているため、ターミナルには何も表示されません。

2. 「>>」による出力リダイレクト(追記)

>>でもコマンドの出力をファイルへリダイレクトできます。ただし、大なり記号1つ(>)と異なるのは、既存のファイルへ書き込む場合に内容を上書きせず、末尾へ追記する点です。ファイルが存在しなければ新しく作成されます。

構文は以下のとおりです。

command >> file

先ほどと同じ動作を>>で行う例がこちらです。

ls -a >> contents.txt

3. 「<」による入力リダイレクト

コマンドラインの<記号を使うと、キーボードの代わりにファイルからコマンドへ入力を渡せます。<を使った入力リダイレクトの構文は次のとおりです。

command < file

入力リダイレクトの使用例を紹介します。

wc -w < files.txt

この例では、files.txtがwc -wコマンドの入力として渡され、ファイル内の単語数が数えられます。ただし、多くの場面では入力リダイレクト記号は必須ではありません。多くのコマンドはデフォルトでファイル名を引数として受け付けるからです。たとえば上記のコマンドは、次のコマンドと同じ結果になります。

wc -w files.txt

4. 「2>」「2>>」によるエラーリダイレクト

コマンドラインで作業していると、エラーに遭遇することがあります。たとえば、適切な権限がないままファイルを実行しようとするケースです。ターミナルがエラーをそのまま表示するのではなく、エラーリダイレクト記号を使えば、エラーメッセージの行き先を自由に指定できます。

エラーのリダイレクト先としては、エラー専用のログファイルを用意しておくと便利です。存在しないディレクトリのファイル一覧を取得しようとする簡単な例を示します。

ls nonexistent 2> error.txt

この例では、nonexistentという名前のファイルやディレクトリが存在しないため、ターミナルはエラーを発生させます。しかし、エラーリダイレクト記号のおかげで、エラーはコンソールに表示される代わりにerror.txtファイルへ保存されます。なお、エラーが発生しなかった場合、このファイルは空のままになります。

既存のファイルの内容を上書きせずにエラーを追記したい場合は、2>の代わりに2>>を使用してください。

5. 「&>」「&>>」による出力とエラーの同時リダイレクト

標準出力と標準エラーのどちらをリダイレクトするか個別に選ぶ代わりに、&>を使えば両方を同時にファイルへ振り向けられます。&>は、出力リダイレクト(>)とエラーリダイレクト(2>)を組み合わせた省略形と考えると分かりやすいでしょう。

&>の構文は次のとおりです。

command &> output.txt

commandのエラーまたは出力は、output.txtファイルへ書き込まれます。具体例を見てみましょう。

ls sample &> output.txt

このコマンドでは、sampleディレクトリが存在しない場合や、存在しても読み取り権限がない場合は、対応するエラーメッセージがoutput.txtへ書き込まれます。一方、ディレクトリが存在し読み取り権限があれば、その内容がoutput.txtへ出力されます。

&>>を使うと、ファイルが既に存在して内容がある場合に、上書きではなく追記で出力を保存できます。

パイプとリダイレクトを組み合わせてコマンドラインの真価を引き出す

パイプとリダイレクトを組み合わせれば、複雑な処理も驚くほど少ない労力で実行できます。両者の組み合わせ方を身につければ、タイピング量を抑えながら多様な操作を行う高度なコマンドを作成できるようになります。

次のコマンドを例にとってみましょう。

ls | grep ".txt" > text_files.txt

lsコマンドがカレントディレクトリの内容を一覧表示します。その出力はgrepコマンドへパイプされ、「.txt」を含むテキストファイルだけが絞り込まれます。最後に、grepコマンドの出力がtext_files.txtファイルへリダイレクトされます。

シンプルでありながら強力なこの例から分かるように、パイプとリダイレクトの可能性を制限するのは、あなたの発想力だけです。

まとめ

このチュートリアルでは、Linuxにおけるパイプとリダイレクトの基本を学びました。それぞれの基礎に加えて、実際の使用例もあわせて確認しました。

それぞれ単体でも十分に強力な機能ですが、最後のセクションで示したように、両者をひとつのコマンドの中で組み合わせることで、さらに幅広い処理が可能になります。ぜひ実際の環境で試しながら、コマンドラインスキルを一段階引き上げてください。


  1. Linuxで覚えておきたい10個のコマンド連結演算子と実用例

    Linuxにおける「コマンドの連結(チェーン)」とは、複数のコマンドを1行にまとめ、その間に挟んだ演算子の働きに応じて実行を制御するテクニックです。シェル上で小さなスクリプトを書くのに近い感覚で、ターミナルから直接手軽に実行できます。定型作業の自動化はもちろん、無人で稼働するサーバーをより体系的かつ安定して動作させるうえでも非常に有効です。あわせて読みたい: Awkと正規表現を使ってファイル内のテキストを抽出・フィルタリングする方法本記事では、日常的によく使われるコマンド連結演算子を10個厳選し、簡潔な説明と実際の実行例とともに解説します。これらを使いこなせるようになれば、短くて意味のあるコマ

  2. 【保存版】シェルスクリプトでLinux変数を完全理解する方法 – declareコマンド徹底活用(パート10)

    Linuxのシェルスクリプト言語は、昔から根強い人気を誇るテーマであり、今後もずっと注目され続けるでしょう。シェルスクリプトはまるで魔法のように、他のプログラミング言語と同等の手軽さでプログラムを作成できます。ただし、自分が何を行っているのか、どんな結果が期待できるのかを深く理解しておくことが重要です。 これまでお届けしてきたシェルスクリプト入門シリーズは、前回の「Linux変数の徹底解説」を含め、多くの読者様から高い評価をいただいています。本記事では、その内容をさらに一歩深掘りしていきます。 変数の属性とは Linux環境のそれぞれの変数には固有のオプションが存在し、これらは「属性」と呼ば