GNU/Linux >> Linux の 問題 >  >> Linux

Linux のパイプ記号 |行う?

出力と入力のリダイレクトに慣れている場合、説明は非常に簡単です。

Command1 | Command2

と同じです

Command1 > tempfile
Command2 < tempfile

tempfile なし . Command1 の出力 Command2 の入力に直接接続されています 転送はメモリ内で行われます。


以下は、新しいユーザーを助けるために少し簡略化されています.

まず、標準入力と標準出力の概念を理解する必要があります。

Linux やその他の UNIX ライクなオペレーティング システムでは、各プロセスに標準入力 (stdin) があります。 ) と標準出力 (stdout )。通常の状況は stdin です はキーボードで stdout 画面または端末ウィンドウです。

ls を実行すると 、出力を stdout にスローします .他に何もしなければ、画面または端末ウィンドウに移動し、表示されます。

現在、いくつかの Linux コマンドはユーザーと対話し、 stdin を使用します そのためには、テキスト エディターがその 1 つです。 stdin から読み取ります キーストロークを受け入れ、何かを行い、stdout に何かを書き込みます .

ただし、対話的には機能しないが大量のデータが必要な非対話型または「フィルター」コマンドもあります。これらのコマンドはすべての stdin を受け取ります 持っている場合は、何かを行ってから stdout にスローします

du という別のコマンドを見てみましょう。 - ディスク使用量を表します。 du /usr 、たとえば、(stdoutに)出力されます 他の Linux コマンドと同様) そのディレクトリ内のすべてのファイルのリストとそのサイズ:

# du /usr
2312    /usr/games
124     /usr/lib/tc
692     /usr/lib/rygel-1.0
400     /usr/lib/apt/methods
40      /usr/lib/apt/solvers
444     /usr/lib/apt
6772    /usr/lib/gnash

すぐにわかるように、それはソートされていません。おそらく、サイズ順にソートする必要があります。

sort stdin から大量のものを取得する「フィルター」コマンドの 1 つです。

したがって、これを行うと:

# du /usr | sort -nr

私たちはこれを取得します, これは少し良いです:

4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668  /usr/lib/vmware
501700  /usr/share/locale
366476  /usr/lib/x86_64-linux-gnu
318660  /usr/lib/libreoffice
295388  /usr/lib/vmware/modules
290376  /usr/lib/vmware/modules/binary
279056  /usr/lib/libreoffice/program
216980  /usr/share/icons

そして、「パイプ」が stdout を接続していることがわかります。 stdin への 1 つのコマンドの 別の。通常、このような状況で、コマンドの出力をフィルター処理、並べ替え、またはその他の方法で操作する場合に使用します。複数のフィルター タイプのコマンドを介して出力を処理する場合は、それらをカスケードできます。

sort と入力すると stdin から読み取ろうとします。 . stdin以降 がキーボードに接続されている場合は、Control-D を押すまで入力と処理を待機します。インタラクティブに使用することを意図していないため、プロンプトは表示されません。

プログラムが stdin かどうかを判断することは可能です。 はインタラクティブかどうかに関係なく、一部のプログラムは、単独で、またはパイプの最後で発行すると、異なる動作をする可能性があります。

また、vi のように、対話的にのみ動作するプログラムをパイプします。 、あなたは悪い時間を過ごすことになります.

パイプは、データがどこにも保存されることなく、あるコマンドから次のコマンドにシャッフルされるという点で、リダイレクトとは異なります。したがって、上記の例では、 du の出力はどこにも保存されません。ほとんどの場合、パイプを使用する理由はコマンドの出力を何らかの方法で処理するためです。ただし、コマンド tee があります。 stdin から受け取ったものをコピーします。 stdout の両方に そしてあなたが選んだファイル。 bash からこれを行うこともできます 私が知らないアンパサンドとブラケットを含む難解な構文を使用しています.


パイプの機能と> と | の違いを本当に知りたい場合は、多くのファイルがあるディレクトリに移動し、

端末 ls から vs ls | more (または Windows から DIR と DIR を使用してそれを行う | 詳細)

> more を使用すると、ls の出力を「more」コマンドに送信するのではなく、「more」というファイルが作成されることがわかります。したがって、誰かが>more を実行した場合、それはおそらく間違いであり、誰も実行しません。 more はよく知られたコマンドです。

<のような> も、コマンドとコマンドではなく、コマンドとファイルをリンクするためのものです。ただし、> はコマンドの出力をファイルに送信しますが、<はコマンドへの入力としてファイルを送信します。 <は通常 cat file1 | を使用するため、めったに使用しません。ファイルの出力をコマンドに送信します。

$ grep a

$ 猫ファイル1 | grep aabc

2 つのパラメータを持つ grep は、grep パターン ファイルの形式です。 1 つのパラメーターを持つ grep は、grep パターンです。また、ファイルの内容をパイプするか、<. <を使用する場合は、最初にコマンド名を書き、次にファイル名を so command

また、多くのコマンドはファイルを入力として受け取るため、 grep a file1 は cat file1 | と同じように機能します。 grep a、および grep a

15 年前から DOS でパイプ (|) と> を実行していました。

方法を要約すると | <および> - とは異なります パイプは 2 つのコマンドの間にあります <と> はコマンドとファイルの間にあります。> はファイルに出力されます。 <はファイルからの入力です。


Linux
  1. Linuxコマンドの最後の&はどういう意味ですか?

  2. この Linux コマンドの - はどういう意味ですか?

  3. Linux での export コマンドの役割は何ですか?

  1. Linuxlsコマンドをマスターする

  2. Linuxコマンドが何をするかを知る方法

  3. Linux でサフィックス .d は何を意味しますか?

  1. Psの出力にはどういう意味がありますか?

  2. コマンド ラインの矢印 (->) 記号は何を意味しますか?

  3. Windows での Linux の ~ (チルダ) に相当するものは何ですか?