Linux管理の下で最も重要で興味深いトピックの1つは、I/Oリダイレクションです。コマンドラインのこの機能により、コマンドの入力と/または出力をファイルにリダイレクトしたり、複数のコマンドをパイプで結合して「コマンドパイプライン」として知られるものを形成したりできます。
実行するすべてのコマンドは基本的に2種類の出力を生成します:
- コマンドの結果(プログラムが生成するデータ)と
- プログラムのステータスおよびユーザーにプログラムの実行詳細を通知するエラーメッセージ。
Linuxおよびその他のUnix系システムでは、シェルによってファイル記述子番号を使用して識別される3つのデフォルトファイルがあります:
- stdinまたは0 – キーボードに接続されており、ほとんどのプログラムはこのファイルから入力を読み込みます。
- stdoutまたは1 – 画面に接続されており、すべてのプログラムは結果をこのファイルに送信します
- stderrまたは2 – プログラムはこのファイルにステータス/エラーメッセージを送信し、これも画面に接続されています。
したがって、I/Oリダイレクションを使用すると、コマンドの入力ソースを変更したり、出力とエラーメッセージの送信先を変更したりできます。これは、“<”
および“>”
のリダイレクト演算子によって可能になります。
Linuxで標準出力をファイルにリダイレクトする方法
標準出力をリダイレクトすることができます。例えば、topコマンドの出力を後で確認するために保存したい場合は、以下のようにします:
$ top -bn 5 >top.log
以下はフラグです:
-b
– topをバッチモードで実行し、出力をファイルや他のコマンドにリダイレクトできます。-n
– コマンドが終了する前の反復回数を指定します。
top.log
ファイルの内容をcatコマンドで表示するには、次のようにします:
$ cat top.log
コマンドの出力を追記するには、“>>”
演算子を使用します。
たとえば、topコマンドの出力をスクリプト(またはコマンドライン)内のtop.logファイルに追記するには、以下の行を入力します:
$ top -bn 5 >>top.log
注意: ファイルディスクリプタ番号を使用しているため、上記の出力リダイレクトコマンドは次のコマンドと同じです:
$ top -bn 5 1>top.log
Linuxで標準エラーをファイルにリダイレクトする方法
コマンドの標準エラーをリダイレクトするには、シェルが何をしようとしているかを理解させるために、ファイルディスクリプタ番号2
を明示的に指定する必要があります。
例えば、以下のlsコマンドは、ルート権限を持たない普通のシステムユーザーによる実行時にエラーを生成することがあります。
$ ls -l /root/
以下のように、標準エラーをファイルにリダイレクトすることができます。
$ ls -l /root/ 2>ls-error.log $ cat ls-error.log

標準エラーを追記するためには、以下のコマンドを使用します。
$ ls -l /root/ 2>>ls-error.log
標準出力/標準エラーを1つのファイルにリダイレクトする方法
コマンドのすべての出力(標準出力と標準エラー)を1つのファイルに取得することも可能です。これはファイルデスクリプターの数を指定して2つの可能な方法で行えます。
1.最初の方法は、以下のように動作します:
$ ls -l /root/ >ls-error.log 2>&1
上記のコマンドは、shellがまずlsコマンドの出力をls-error.logファイルに送信することを意味します(>ls-error.log
を使用)、そしてすべてのエラーメッセージをファイルデスクリプター2(標準出力)に書き込みます。これは2>&1
を使用して、ls-error.logファイルにリダイレクトされます。これは標準エラーも同じファイルに標準出力と同じように送信されることを示しています。
2.2番目の直接な方法は以下の通りです:
$ ls -l /root/ &>ls-error.log
以下のように、標準出力と標準エラーを1つのファイルに追記することもできます。
$ ls -l /root/ &>>ls-error.log
標準入力をファイルにリダイレクトする方法
ほとんどのコマンドは、標準入力からの入力を受け取ります。デフォルトでは、標準入力はキーボードに接続されています。
標準入力をkeyboard以外のファイルから指定するには、以下のように"<"
オペレータを使用します。
$ cat <domains.list

標準入力/出力をファイルに redirect する方法
以下のようにsortコマンドを使用して、標準入力と標準出力の redirect を同時に行うことができます。
$ sort <domains.list >sort.output
Pipeを使用してI/O redirectを行う方法
1つのコマンドの出力を他のコマンドの入力として redirect するには、pipeを使用することができます。これは、複雑な操作のための有用なコマンドラインを構築する強力な手段です。
たとえば、以下のコマンドは最近更新された5つのファイルを列出します。
$ ls -lt | head -n 5
ここでは、以下のオプションが最初に表示されます。
-l
– 長い列出形式を有効にします-t
– 最新のファイルと共に、更新時間で並べ替えします-n
– 表示するヘッダ行の数を指定します
Pipeline構築に使用する重要なコマンド
ここで、2つの重要なコマンドの簡単な回顾が行われます。これらは、コマンドのパイプラインを構築するために使用されます。
xargsは標準入力からコマンドラインを構築し、実行するためのツールです。以下はxargsを使用したパイプラインの例で、このコマンドはLinuxでファイルを複数のディレクトリにコピーするために使用されます:
$ echo /home/aaronkilik/test/ /home/aaronkilik/tmp | xargs -n 1 cp -v /home/aaronkilik/bin/sys_info.sh

オプションは以下の通りです:
-n 1
– xargsには1つの引数を1行に最大で使用し、cpコマンドに送信するよう指示しますcp
– ファイルをコピーします-v
– コピーコマンドの進行状況を表示します。
詳細な使用方法や情報はxargsマニュアルページを読むことで取得できます。
$ man xargs
A tee command reads from standard input and writes to standard output and files. We can demonstrate how tee works as follows:
$ echo "Testing how tee command works" | tee file1

ファイルまたはテキストフィルターは、効果的なLinuxファイル操作のために通常、パイプと一緒に使用されます。これらは、命令の出力を再構築するなど、強力な方法で情報処理を行い、有用なLinuxレポートの生成において重要な機能を提供します。テキストをファイル内で修正することもでき、さらにLinuxシステム管理者のためのいくつかのタスクを実行します。
Linuxのフィルターとパイプについてもっと了解するには、この記事Apacheサーバーにアクセスしているトップ10のIPアドレスを見つけるを読むことが推奨されます。これは、フィルターとパイプを使用した有用な例です。
この記事では、Linuxでの入出力重定向の基本を説明しました。下のフィードバック部分で、お気に入りの情報をシェアしてください。
Source:
https://www.tecmint.com/linux-io-input-output-redirection-operators/