以下の2つのコマンドの違いを知りたいのですが、2)を使用する必要があることは理解していますが、1)と2)で発生する正確なシーケンスを知りたいのですが、ファイル名に200文字が含まれているとします。
1)猫のファイル名| grep正規表現
2)grepregexファイル名
以下の2つのコマンドの違いを知りたいのですが、2)を使用する必要があることは理解していますが、1)と2)で発生する正確なシーケンスを知りたいのですが、ファイル名に200文字が含まれているとします。
1)猫のファイル名| grep正規表現
2)grepregexファイル名
機能的に (出力に関して)、これら 2 つは同じです。最初のものは、シェルがパイプで2つを接続しているため、ファイルの内容を標準出力に送信する別のプロセスを実際に作成しますcat
。これは、の標準入力に表示されます。grep
その意味でgrep regex <filename
は同等ですが、プロセスが 1 つ少なくなります。
次のように、追加情報 (ファイル名) が で使用されている場合に違いが見られるのはバリアントですgrep
。
grep -n regex filename1 filename2
それとの違い:
cat filename1 filename2 | grep -n regex
前者は個々のファイルを認識しているのに対し、後者はそれを1 つのファイル (名前なし) として認識しているということです。
前者はあなたに与えるかもしれませんが:
filename1:7:line with regex in 10-line file
filename2:2:another regex line
後者は次のようになります。
7:line with regex in 10-line file
12:another regex line
ファイル名がwc
.
$ cat qq.in
1
2
3
$ wc -l qq.in # knows file so prints it
3 qq.in
$ cat qq.in | wc -l # does not know file
3
$ wc -l <qq.in # also does not know file
3
最初の1つ:
cat filename | grep regex
通常、cat はファイルを開き、その内容を 1 行ずつ stdout に出力します。しかし、ここではその内容をパイプ '|' に出力します。その後、grepはパイプから読み取ります(パイプを標準入力として受け取ります)。正規表現が一致する場合、行を標準出力に出力します。しかし、ここでは詳細な grep が新しいシェル プロセスで開かれているため、パイプはその入力を出力として新しいシェル プロセスに転送します。
二つ目:
grep regex filename
ここで grep はファイルから直接読み取り (上記ではパイプから読み取りを行っていました)、正規表現と一致する場合は行を stdout に出力します。
実際の実行時間の差を確認したい場合は、まず 100000 行のファイルを作成します。
user@server ~ $ for i in $(seq 1 100000); do echo line${1} >> test_f; done
user@server ~ $ wc -l test_f
100000 test_f
次に測定します。
user@server ~ $ time grep line test_f
#...
real 0m1.320s
user 0m0.101s
sys 0m0.122s
user@server ~ $ time cat test_f | grep line
#...
real 0m1.288s
user 0m0.132s
sys 0m0.108s
ご覧のとおり、違いはそれほど大きくありません...
機能的には同等ですが、シェルは 2 つのプロセスを forkcat filename | grep regex
し、それらをパイプで接続します。