21

以下の2つのコマンドの違いを知りたいのですが、2)を使用する必要があることは理解していますが、1)と2)で発生する正確なシーケンスを知りたいのですが、ファイル名に200文字が含まれているとします。

1)猫のファイル名| grep正規表現

2)grepregexファイル名

4

5 に答える 5

25

機能的に (出力に関して)、これら 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
于 2012-11-22T07:53:23.327 に答える
6

最初の1つ:

cat filename | grep regex

通常、cat はファイルを開き、その内容を 1 行ずつ stdout に出力します。しかし、ここではその内容をパイプ '|' に出力します。その後、grepはパイプから読み取ります(パイプを標準入力として受け取ります)。正規表現が一致する場合、行を標準出力に出力します。しかし、ここでは詳細な grep が新しいシェル プロセスで開かれているため、パイプはその入力を出力として新しいシェル プロセスに転送します。

二つ目:

grep regex filename

ここで grep はファイルから直接読み取り (上記ではパイプから読み取りを行っていました)、正規表現と一致する場合は行を stdout に出力します。

于 2012-11-22T07:45:34.810 に答える
4

実際の実行時間の差を確認したい場合は、まず 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

ご覧のとおり、違いはそれほど大きくありません...

于 2012-11-22T07:57:42.713 に答える
0

機能的には同等ですが、シェルは 2 つのプロセスを forkcat filename | grep regexし、それらをパイプで接続します。

于 2012-11-22T07:45:24.463 に答える