grep vs cat和grep的区别

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

1)cat文件名| grep正则expression式

2)grep正则expression式文件名

在功能上(就产量而言),这两者是相同的。 第一个实际上创建了一个独立的进程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 

第一:

 cat filename | grep regex 

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

第二个:

 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 

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

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

实际上,虽然产出是一样的,

 -$cat filename | grep regex 

这个命令查找文件“filename”的内容,然后在其中获取正则表达式; 而

 -$grep regex filename 

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