次のコマンドを比較してみてください。
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つの主な理由は次のとおりです。
他のコマンドまたは長くて複雑なコマンドパイプラインのプレースホルダーとして機能します。
psql
たとえば、大容量ファイルやクエリなどのクエリのデータを処理するためにスクリプトまたは1行のコードを書く場合は、入力(一部)をサンプルファイルに保存mysql
し、次の結果が得られるまで入力として使用できます。スクリプトまたは1行の権利です。その後、実際のコマンドまたはパイプに置き換えます。wget
jq
cat sample
cat
同様に、誰かに配管について教えることが目的であれば、これは便利なプレースホルダーです。
(多くの人がこれをCatやUUOCの無駄な使用と呼んでいます。これは、主に彼らがうまくやって初心者を学ぶのではなく、いわゆる優れた知識で打つのを楽しむから
cat
です<
。細部にすぎず、世界がすぐに終わりを迎え、災いになるように無視することはできませんcat
.)プログラムが入力ファイルのファイル名を知りたくない場合。例えば 。
cat * | grep ...
grep ... *
これは一般的に重要ではありませんが、そのようなことが発生した場合は非常に重要です。
の場合は、
grep
ファイル名のリストを表示しないを使用できますが、-h
他のプログラムにはこれらのオプションはありません。wc
例えば、必要なくても、各ファイルのファイル名と数は常に出力されます。もちろん、そのようなものを使用できますが、そのようなことをして結果ファイル名のリストがシェルの最大コマンドライン長を超える場合は機能しません。
wc * | tail -1 | awk '{print $1, $2, $3}'
この場合、複数の「合計」行が得られます。 (実際の合計行と出力で「total」というファイルを区別する方法はありません)。find . -type f -exec wc {} +
find
wc
find . -type f -exec cat {} + | wc
find
見つかったファイルの数(なし、1つ以上)に関係なく、1行の出力(全体)のみが生成されます。(とオプションの
wc
両方が必要です。)--totals-only
--no-totals