catコマンドはファイルを返しますか、それともファイルの内容を返しますか?

catコマンドはファイルを返しますか、それともファイルの内容を返しますか?

次のコマンドを比較してみてください。

cat f.txt | grep "someText" 
grep "someText" f.txt

彼らはすべて動作するようです。ただし、catに関する文書によると、catはファイル名の代わりにファイルの内容を出力し、grepコマンドはファイルの内容の代わりにファイル名を使用します(間違っている場合は訂正してください)。それでは、最初のコマンドはなぜ実行されますか? grepはファイル名の代わりにファイルの内容を提供するので動作します。

もう一つの質問:両方が機能しますが、なぜ2番目の代わりに最初の行を使用するのですか?最初の行は重複していますか?

答え1

最初の例では

cat f.txt | grep "someText" 

grepインポートするファイル名パラメータはなく、検索する文字列のみがあります。この場合、grep検索するテキストを標準入力から読み込みます。この場合、標準入力はの出力からパイプされますcat f.txt出力ファイルの内容ファイル名ではありません。次のようにして標準入力からデータを読み取る
こともできます。grep

< f.txt grep "someText"

それ自体を使用するcatことは通常重複し(無関係)、grep上記の入力リダイレクトに置き換えることができます。入力を前処理する必要がある場合を除き、常に例では2番目の形式を使用します。

答え2

cat最初の例のように使用する2つの主な理由は次のとおりです。

  1. 他のコマンドまたは長くて複雑なコマンドパイプラインのプレースホルダーとして機能します。

    psqlたとえば、大容量ファイルやクエリなどのクエリのデータを処理するためにスクリプトまたは1行のコードを書く場合は、入力(一部)をサンプルファイルに保存mysqlし、次の結果が得られるまで入力として使用できます。スクリプトまたは1行の権利です。その後、実際のコマンドまたはパイプに置き換えます。wgetjqcat samplecat

    同様に、誰かに配管について教えることが目的であれば、これは便利なプレースホルダーです。

    (多くの人がこれをCatやUUOCの無駄な使用と呼んでいます。これは、主に彼らがうまくやって初心者を学ぶのではなく、いわゆる優れた知識で打つのを楽しむからcatです<。細部にすぎず、世界がすぐに終わりを迎え、災いになるように無視することはできませんcat.)

  2. プログラムが入力ファイルのファイル名を知りたくない場合。例えば 。cat * | grep ...grep ... *

    これは一般的に重要ではありませんが、そのようなことが発生した場合は非常に重要です。

    の場合は、grepファイル名のリストを表示しないを使用できますが、-h他のプログラムにはこれらのオプションはありません。wc例えば、必要なくても、各ファイルのファイル名と数は常に出力されます。

    もちろん、そのようなものを使用できますが、そのようなことをして結果ファイル名のリストがシェルの最大コマンドライン長を超える場合は機能しません。wc * | tail -1 | awk '{print $1, $2, $3}'この場合、複数の「合計」行が得られます。 (実際の合計行と出力で「total」というファイルを区別する方法はありません)。find . -type f -exec wc {} +findwc

    find . -type f -exec cat {} + | wcfind見つかったファイルの数(なし、1つ以上)に関係なく、1行の出力(全体)のみが生成されます。

    (とオプションのwc両方が必要です。)--totals-only--no-totals

関連情報