grep Vs cat和grep之间的区别

时间:2012-11-22 07:40:59

标签: unix

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

1)cat filename | grep regex

2)grep正则表达式文件名

5 个答案:

答案 0 :(得分:15)

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

在这个意义上,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

答案 1 :(得分:4)

第一个:

cat filename | grep regex

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

第二个:

grep regex filename

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

答案 2 :(得分:2)

如果要检查实际执行时间差异,请先创建一个包含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

正如我们所看到的,差异并不是太大......

答案 3 :(得分:0)

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

答案 4 :(得分:0)

实际上,虽然输出是相同的;

-$cat filename | grep regex

此命令查找文件的内容&#34; filename&#34;,然后在其中获取正则表达式;而

-$grep regex filename

此命令直接在文件&#34; filename&#34;

中搜索名为regex的内容