Linuxでコマンドの実行結果を画面やファイルに出力する方法(リダイレクト・パイプ)

Linuxでコマンドの実行結果を画面やファイルに出力する方法(リダイレクト・パイプ)

Linux環境では、コマンドの入出力は以下の3種類で構成されており、コマンドはキーボードから入力(標準入力)を受け付けて、実行結果やエラーは画面に出力(標準出力・標準エラー出力)されます。

  • 標準入力(0):キーボード
  • 標準出力(1):画面
  • 標準エラー出力(2):画面

ですが、コマンドの実行結果をファイルに出力したり、ファイルの内容をコマンドの入力元にしたりなど、入力元や出力先を変更したいときがあります。そのようなときは、リダイレクトやパイプを利用します。

そこでここでは、リダイレクトやパイプを使って、コマンドの入力元や出力先を変更する方法を紹介します。

この記事は、以下の環境での動作結果を基にしています。他のディストリビューションやバージョンでは、動作結果が異なる場合があることをご了承ください。

ソフトウェアバージョン
CentOS Linux7.4.1708

リダイレクト

リダイレクトは、コマンドの入力元や出力先を変更できる機能で、ファイルの内容をコマンドの入力元として指定したり、コマンドの実行結果をファイルに出力したりできます。

リダイレクトには、次のような種類があります。

コマンド説明
コマンド > ファイルコマンドの実行結果をファイルに出力する
コマンド < ファイルファイルの内容をコマンドに入力する
コマンド >> ファイルコマンドの実行結果をファイルに追記する
コマンド 2> ファイルコマンドのエラーをファイルに出力する
コマンド 2>> ファイルコマンドのエラーをファイルに追記する
コマンド > ファイル 2>&1コマンドの実行結果やエラーをファイルに出力する
コマンド >> ファイル 2>&1コマンドの実行結果やエラーをファイルに追記する

パイプ

コマンドの実行結果(標準出力)を別のコマンドの標準入力としたいときは、パイプを利用します。

たとえば、コマンド1の標準出力をコマンド2の標準入力としたいときは、次にように実行します。

# コマンド1 | コマンド2

また、パイプは複数つなげるすることもでき、次のような使い方もできます。

# コマンド1 | コマンド2 | コマンド3

画面とファイルの両方に出力するには

リダイレクトを利用すると、入力元や出力先にファイルなどを指定できますが、ときには画面とファイルの両方に出力したいときがあります。

そのような時は、パイプとteeコマンドを利用します。

たとえば、コマンドやスクリプトの実行結果を、画面とファイルの両方に出力したいときは、次のように実行します。

# コマンド | tee ファイル

コマンドやスクリプトの実行結果を、画面とファイルの両方に出力したいときは、次のように実行します。

# コマンド | tee -a ファイル

コマンドやスクリプトの実行結果を、エラーも含めて画面とファイルの両方に出力したいときは、次のように実行します。

# コマンド 2>&1 | tee ファイル

コマンドやスクリプトの実行結果を画面と複数のファイルに出力することもできます。

# コマンド | tee ファイル1 ファイル2

あとがき

なお、未確認情報ですが、teeコマンドを使って大容量のデータをファイルに出力すると、リダイレクトに比べて遅いらしいので、大容量のファイルを処理する場合は注意が必要かもしれません。