Linux コマンドラインでプロのようにパイプとリダイレクトを行う方法

in tech

まとめ

  • Linux コマンドは、入力、出力、およびエラー メッセージに標準ストリームを利用できます。

  • リダイレクトは、出力ストリームを端末ウィンドウではなくファイルに送信します。

  • パイピングを使用すると、コマンドを連鎖させることができるため、あるコマンドの出力が別のコマンドの入力になります。

Linux では、パイプとリダイレクトを使用して、コマンドからの出力を強力な方法で使用できます。それをファイルにキャプチャするか、他のコマンドの入力として使用します。知っておくべきことは次のとおりです。

ストリームとは何ですか?

Linux には、他の Unix 系オペレーティング システムと同様、ストリームの概念があります。各プロセスには、stdin と呼ばれる入力ストリーム、stdout と呼ばれる出力ストリーム、および stderr と呼ばれるエラー用のストリームがあります。 Linux ストリームには、現実世界のストリームと同様、2 つのエンドポイントがあります。これらには、ソースまたは入力と、宛先または出力があります。

入力ストリームはキーボードからコマンドに送信され、情報やコマンドなどのテキストをプロセスに送信できるようになります。出力ストリームはコマンドから取得され、通常はターミナル ウィンドウに送信されます。 stderr ストリームは端末ウィンドウにも書き込みます。

ストリームをリダイレクトしたり、パイプしたりできます。 リダイレクション これは、出力を端末ウィンドウ以外の場所に送信することを意味します。 配管 これは、1 つのコマンドの出力を取得し、それを別のコマンドへの入力として使用することを意味します。

これにより、コマンドを連鎖させて、連携して動作する一連の単純なコマンドから高度なソリューションを作成できます。

ストリームのリダイレクト

リダイレクトの最も単純な形式は、コマンドから出力を取得してファイルに送信します。こんな些細なケースでも役に立つことがあります。おそらく、コマンドの出力の記録が必要か、スクロールする出力が多すぎて読めない可能性があります。

このテスト PC では、du コマンドは 1380 行のテキストを出力します。それをファイルに送信します。

du > disk-usage.txt
du からの出力をテキスト ファイルにリダイレクトします。

右山括弧は、du コマンドからの stdout 出力を disc-usage.txt というファイルにリダイレクトするようにシェルに指示します。出力は端末ウィンドウに送信されません。

ls を使用してファイルが作成されたことを確認し、wc を使用してファイル内の行、単語、文字を数えることができます。予想どおり、wc はファイルに 1380 行があると報告します。

ls 
wc disk-usage.txt
du からリダイレクトされた出力を含むディスク使用量ファイル内の行数をカウントします。

このタイプのリダイレクトでは、ファイルを使用するたびにファイルが作成または上書きされます。リダイレクトされたテキストを既存のファイルの末尾に追加する場合は、次のように二重右山括弧「>>」を使用します。

ls /home/dave-mckay/ -R >> disk-usage.txt 
wc disk-usage.txt 
リダイレクトされた出力を既存のファイルに追加します。

-N (行番号) オプションをlessとともに使用すると、新しい情報が行1380の後に追加されたことを確認できます。

追加されたデータがファイル内の以前のエントリを上書きしていないことを確認します。

エラーを生成するコマンドを作成すると、stdout をリダイレクトしているだけなので、stderr エラー メッセージは依然としてターミナル ウィンドウに送信されることがわかります。

wc disk-usage.txt missing-file.txt > results.txt 
wc: missing-file.txt: No such file or directory
cat results.txt
stdout をファイルにリダイレクトしますが、stderr メッセージがターミナル ウィンドウに表示されたままになります。

disc-usage.txt の結果は results.txt ファイルに送信されますが、存在しない missing-file.txt のエラー メッセージはターミナル ウィンドウに送信されます。

右山括弧に数値インジケーターを追加して、どのストリームをリダイレクトしているかを明示することができます。ストリーム 1 は標準出力、ストリーム 2 は標準エラー出力です。 stdout を 1 つのファイルにリダイレクトし、stderr を別のファイルにリダイレクトすることが非常に簡単にできます。

wc disk-usage.txt missing-file.txt 1> results.txt 2> error.txt 
cat results.txt
cat error.txt
stdout を 1 つのファイルにリダイレクトし、stderr を別のファイルにリダイレクトします。

両方のストリームを 1 つのファイルにリダイレクトしたい場合は、stdout をファイルにリダイレクトし、stdout と同じ宛先に stderr をリダイレクトするようにシェルに指示します。

wc disk-usage.txt missing-file.txt 1> results.txt 2>&1
cat results.txt
stdout と stderr を同じファイルにリダイレクトします。

エラー メッセージはすべてキャプチャされ、stdout と同じファイルに送信されます。

出力をまったく保存したくない場合もあり、ターミナル ウィンドウには何も書き込まれたくないだけです。 null デバイス ファイルは、送信されたすべてのものを暗黙のうちに消費し、不要な画面出力を送信するのに便利な宛先です。

rm disk-usage.txt missing-file.txt 1> /dev/null 2>&1
stdout と stderr の両方を /dev/null デバイス ファイルに送信します。

削除しようとしているファイルの 1 つが存在しない場合でも、stdout メッセージも stderr メッセージもターミナル ウィンドウに書き込まれません。

リダイレクトで実行できる最後のトリックは、ファイルをコマンドの stdin ストリームに読み取ることです。

wc < /etc/passwd
リダイレクトを使用してファイルをコマンドの標準入力ストリームに読み込みます。

これを出力のリダイレクトと組み合わせることができます。

wc < /etc/passwd > results.txt
cat results.txt
リダイレクトを使用してファイルをコマンドの標準入力ストリームに読み取り、出力を別のファイルに送信します。

パイプに流れを通す

パイプは、あるコマンドの stdout を効果的にリダイレクトし、それを別のコマンドの stdin に送信します。パイプ処理はコマンド ラインの最も強力な機能の 1 つであり、コア Linux コマンドとユーティリティの使用法を変えることができます。

コマンドの出力を別のコマンドにパイプするには、パイプ「|」を使用します。シンボル。たとえば、ホーム ディレクトリ内のすべてのファイルとサブディレクトリを再帰的に一覧表示したい場合、ls からの出力がターミナル ウィンドウで高速にぼやけて表示されるのがわかります。

ls コマンドを less にパイプすると、便利なファイル ビューアに結果が表示されます。

ls -R ~ | less
再帰的 ls コマンドの結果。less ファイル ビューアに表示されます。

これは、出力をファイルに送信してファイルを開くという 2 段階の手動プロセスよりも効率的です。

別のコマンドによる出力のパイプ処理

パイプ処理が真価を発揮するのは、2 番目のコマンドが最初のコマンドの出力に対してさらに処理を行うときです。

コンピュータ上のユーザー アカウントと疑似ユーザー アカウントの数を数えてみましょう。 cat を使用して /etc/passwd ファイルの内容をダンプし、それを wc にパイプします。 -l (行) オプションは、そのファイル内の行数をカウントします。アカウントごとに 1 行あるため、アカウントがカウントされます。

cat /etc/passwd | wc -l
wc を使用して /etc/passwd ファイル内の行をカウントします。

それはとてもそう思います。それらのアカウントの名前を見てみましょう。今回は cat を awk にパイプします。 awk コマンドは、フィールド区切り文字としてコロン「:」を使用し、最初のフィールドを出力するように指示されます。

cat /etc/passwd | awk -F: '{print $1}'
cat の出力を awk にパイプして最初のフィールドを抽出します。

コマンドを追加し続けることができます。リストをソートするには、awk からの出力が sort コマンドに送られるように、sort コマンドを追加します。

cat /etc/passwd | awk -F: '{print $1}' | sort
cat を awk にパイプして sort にパイプし、/etc/passwd からアカウント名のソートされたリストを取得します。

一連のコマンドを介して出力をパイプ処理する

ここでは、3 つのパイプで結合された 4 つのコマンドのセットを示します。 ps コマンドは、実行中のプロセスを一覧表示します。 -e (すべて) オプションはすべてのプロセスをリストし、-o (出力) オプションはレポートする情報を指定します。 comm トークンは、プロセス名のみを表示したいことを意味します。

次に、プロセス名のリストが grep にパイプされ、名前に chrome が含まれるプロセスが除外されます。フィルタリングされたリストは sort に入力され、リストが並べ替えられます。ソートされたリストは uniq にパイプされます。 -c (カウント) オプションは、一意のプロセス名をカウントします。次に、楽しみのために、Firefox に対して同じことを行います。

ps -e -o comm | grep chrome | sort | uniq -c
ps -e -o comm | grep firefox | sort | uniq -c
ps、grep、sort、uniq という 4 つのパイプされたコマンドを使用して、検索手がかりに一致する一意のプロセス名の数を取得します。

無限の組み合わせ

パイプで結合できるコマンドの数に制限はありませんが、各コマンドは独自の新しいサブシェルで開かれることに注意してください。最も控えめなスペックの最新のコンピューターでも問題はありませんが、速度の低下が見られる場合は、コマンドを簡素化することを検討してください。あるいは我慢してください。

関連記事

前の投稿
ChatGPT が (再び) ダウンしました |ライフハッカー
次の投稿
最高のAmazon Echoスピーカーは現在80ドル