21

我想知道以下 2 个命令之间的区别,我知道应该使用 2),但我想知道 1) 和 2) 中发生的确切顺序,假设文件名中有 200 个字符

1) 猫文件名 | grep 正则表达式

2) grep 正则表达式文件名

4

5 回答 5

25

在功能上(就输出而言),这两者是相同的。第一个实际上创建了一个单独的进程cat,它只是将文件的内容发送到标准输出,标准输出显示在grep.

在这个意义grep regex <filename上也是等价的,但过程少了一个。

当额外信息(文件名)由 使用时,您将开始看到不同之处在于变体,例如grep

grep -n regex filename1 filename2

那和之间的区别:

cat filename1 filename2 | grep -n regex

是前者知道单个文件,而后者将其视为一个文件(没有名称)。

而前者可能会给你:

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

第一:

cat filename | grep regex

通常 cat 打开文件并将其内容逐行打印到标准输出。但是在这里它将其内容输出到管道'|'。之后 grep 从管道读取(它将管道作为标准输入)然后如果匹配正则表达式将行打印到标准输出。但是这里有一个详细的 grep 在新的 shell 进程中打开,因此管道将其输入作为输出转发到新的 shell 进程。

第二个:

grep regex filename

这里 grep 直接从文件读取(上面是从管道读取)并匹配正则表达式,如果匹配打印行到标准输出。

于 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 回答
1

实际上,尽管输出是相同的;

-$cat filename | grep regex

该命令查找文件“filename”的内容,然后获取其中的正则表达式;尽管

-$grep regex filename

该命令直接在文件“filename”中搜索名为regex的内容

于 2017-10-13T01:27:09.707 回答
0

在功能上它们是等价的,但是,shell 将分叉两个进程cat filename | grep regex并用管道连接它们。

于 2012-11-22T07:45:24.463 回答