Linux 管理者として、出力を端末に出力するだけでなく、コマンドの出力をファイルに保存しなければならない場合が数多くあります。方法がわからない? Unix の tee コマンドに任せましょう。
このチュートリアルでは、tee
を使用するさまざまな方法を学習します。 出力をファイルに保存して追加するコマンド。
準備?読み進めて、シェル スクリプトを次のレベルに引き上げましょう!
前提条件
このチュートリアルは実践的なデモンストレーションです。先に進みたい場合は、Linux システムを使用していることを確認してください。このチュートリアルでは Ubuntu 20.04 を使用しますが、Linux の任意のフレーバーを使用できます。
コマンド出力のリダイレクト (STDOUT/STDERR)
tee
を実行する前に コマンドを実行するには、リダイレクトがどのように機能するかを理解することが重要です。 Linux では、デバイス、ディレクトリ、さらにはコマンドの出力など、すべてがファイルと見なされます。その結果、あるコマンドの出力を取得して、その出力を別のコマンド (ファイル リダイレクト) の入力として使用できます。
リダイレクトにはさまざまな種類があり、それぞれに目的があります。しかし、 tee
を実行すると コマンドでは、主に 2 つの異なるタイプのリダイレクトを使用します:
- 標準出力リダイレクト (STDOUT) (>) – コマンドのデフォルト出力。
- 標準エラー リダイレクト (STDERR)(2>) – コマンドによって生成され、画面に表示されるエラー メッセージ。
どちらのリダイレクトも、コマンドの出力を取得してファイルに保存しますが、以下でリダイレクトがどのように機能するかを確認できます。
ls
を実行します コマンドを引数なしで実行して、作業ディレクトリのすべての内容 (ファイルとフォルダー) を一覧表示します。
ls
以下は、ls コマンドの STDOUT です。
次に、以下のコマンドを実行して、意図的にディレクトリの内容を一覧表示します (fake_directory
) 存在しません。
ls fake_directory
ディレクトリが存在しないというエラー メッセージが表示されます。この出力は、ls コマンドの STDERR です。
コマンド出力のファイルへの保存
ls
の STDOUT を保存したいとします。 出力を端末に出力するだけでなく、コマンドをファイルに出力します。この場合、リダイレクト演算子 (>
) が便利です。
1. 次のコマンドを実行して、ls コマンドの STDOUT を ls_stdout.txt という名前のファイルに保存/リダイレクト (>) します。このコマンドは出力をファイルに保存するため、端末には出力が表示されません。
ls > ls_stdout.txt
2. 次に、以下の cat コマンドを実行して、ls_stdout.txt ファイルの内容を表示します。
cat ls_stdout.txt
3. 同様に、次のコマンドを実行して、ls コマンドの STDERR (2>) を ls_stderr.txt という名前のファイルに保存します。繰り返しますが、出力はファイルに保存されるため、ターミナルで出力を取得することはできません。
ls fake_directory 2> ls_stderr.txt
4. 次に、以下の cat コマンドを実行して、ls_stderr.txt ファイルの内容を確認します。
cat ls_stderr.txt
以下で、ls コマンドの STDERR が ls_stderr.txt に保存されたことを確認できます。 ファイル。
5. 以下のコマンドを実行して、ls コマンドの (&>) STDOUT と STDERR の両方を ls_alloutput.txt という名前のファイルに保存します。
両方を手に入れることができるのに、なぜ1つに落ち着くのでしょうか?通常、トラブルシューティングやログ記録のために、両方の出力を同じファイルに保存することをお勧めします。
ls &> ls_alloutput.txt
6. 最後に、次の cat コマンドを実行して ls_alloutput.txt ファイルの内容を表示します
cat ls_alloutput.txt
パイプによるプログラムの接続
出力をファイルに保存するだけでなく、プログラムを接続するなど、パイプを使用してさらに多くのことを実行できます。実際のシナリオでは、パイプをファイル リダイレクトおよび tee
と組み合わせて使用する可能性が最も高いでしょう。 コマンド。
パイプ (|
) は、あるコマンドの出力を別のコマンドの入力に接続できるプロセス間通信のメカニズムです。つまり、パイプは 1 つのプロセスの STDOUT を受け取り、その STDOUT を別のプロセスの STDIN に接続します。
次の grep コマンドを実行して、/etc/services ファイルで単語 tcp を含むすべての行を見つけます。
grep tcp /etc/services
次に、同じ grep
を実行します 以下のコマンド。しかし今回は、上記の grep
の出力をパイプします。 less
へのコマンド コマンドを使用して、検索結果を一度に 1 画面ずつ表示します。
grep tcp /etc/services | less
配管はどのように機能しますか?以下に示すように、パイプ文字 (|) を使用すると、grep
の出力が コマンドは一時的な場所に保存されます。出力は、less
への入力として渡されます。 コマンド。
Unix Tee の組み合わせ (tee
) コマンド、パイプ、およびリダイレクト
ここまでで、tee
がどのように機能するかを学びました。 コマンド、パイプ、およびリダイレクトが機能します。しかし、コマンド出力をより適切に制御するために、3 つすべてを一緒に使用してみませんか?
以前はリダイレクトでパイピングを使用していましたが、これは大きな一歩です。今回は、パイピングと tee
を使用します コマンドを使用して、あるコマンドの出力を別のコマンドに送信してさらに処理します。
以下のコマンドを実行して、ls
の出力を送信します。 画面へのコマンドと result.txt
ファイル。 ls
の出力 さらに grep
にパイプされます ip
という単語を含む行のみをフィルタリングするコマンド .
ls | grep 'ip' | tee result.txt
次に、cat
を実行します 結果の内容を確認するコマンド .txt ファイル。
cat result.txt
既存のファイルへの出力の追加
以前にコマンドの出力をファイルに保存しましたが、新しいファイルを作成する代わりに既存のファイルを更新できますか?はい! tee
にしましょう コマンドで魔法をかけてください。
デフォルトでは、tee
コマンドは、既存のファイルの内容を上書きします。しかし、多くの場合、コマンドの出力を既存のファイルに追加したいことがあります。すべてのサーバー イベントをリアルタイムでログ ファイルに記録するなど。
この機能により、サーバーでイベントが発生するたびにログ ファイルに新しいエントリが追加されます。
次のコマンドを実行して、ls -lR コマンドの出力を取得し、その出力 (tee -a) を result.txt に追加します。 ファイルの内容。コマンド出力をファイルに送信しているため、このコマンドは出力を提供しません。
ls -lR | tee -a result.txt
次に、cat
を実行します result.txt
の内容を確認するコマンド ファイル。
cat result.txt
以下に示すように、ls -lR
の出力は コマンドは result.txt の末尾に追加されます ファイル。
tee
の使用 sudo
と組み合わせたコマンド
多くのコマンドには昇格した権限または sudo
が必要です /etc 内で変更を行うなどのアクセス ディレクトリ。問題は、tee
はどうかということです。 コマンドは sudo
と連携して動作します ?はい!
tee コマンドの先頭に sudo を追加すると、root 以外のユーザーが、root ユーザーのみが変更できるファイルにデータを書き込むことができます。たとえば、ユーザー ata を有効にしたいとします。 /etc/ata.conf にデータを書き込む ファイル。しかし同時に、ユーザーに ata を与えたくありません。 ルート権限。
1. root 以外のユーザーでマシンにログインします。
2. 次に、sudo なしで次のコマンドを実行して、テキスト データを /etc/ata.conf ファイルに書き込みます。
echo "data" > tee /etc/ata.conf
以下に示すように、ata から Permission denied エラーが発生します。 ユーザーが /etc/ata.conf への書き込みアクセス権を持っていない ファイル。
3. ステップ 2 と同じコマンドを実行して、テキスト データを /etc/ata.conf ファイルに書き込みます。ただし、今回は、tee コマンドの前に sudo コマンドを追加します。そうすることで、ユーザーは ata root 以外のユーザーとして (昇格された) コマンドを完了します。
echo "data" | sudo tee /etc/ata.conf
最後に、以下の cat コマンドを実行して ata ユーザーはテキスト「データ」を /etc/ata.conf に書き込むことができます。
cat /etc/ata.conf
結論
このチュートリアルを通して、Unix の tee コマンドを使用してデータをファイルに書き込む方法と、それが他のコマンドとどのように連携するかを学習しました。この時点で、Linux コマンド ライン環境で入出力を管理するために使用できる強力なコマンドの組み合わせができているはずです。
あなたはすし職人のように、各料理に入れる材料と比率を完全にコントロールします。顧客の好みに合わせて、各注文をその場でカスタマイズできます。唯一の制限はあなたの想像力です (おそらく端末ウィンドウのサイズ)。
さあ、素晴らしいコマンド ラインの組み合わせを作成してみましょう!