grep Vs cat和grep之间的区别

uni*_*007 13 unix

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

1)cat filename | grep正则表达式

2)grep正则表达式文件名

pax*_*blo 15

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

从这个意义上讲,grep regex <filename它也是等同的,但只需少一个过程.

在那里你会开始看到不同的是变种时的额外信息(文件名)时使用grep,如用:

grep -n regex filename1 filename2
Run Code Online (Sandbox Code Playgroud)

这和之间的区别:

cat filename1 filename2 | grep -n regex
Run Code Online (Sandbox Code Playgroud)

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

虽然前者可能会给你:

filename1:7:line with regex in 10-line file
filename2:2:another regex line
Run Code Online (Sandbox Code Playgroud)

后者更像是:

7:line with regex in 10-line file
12:another regex line
Run Code Online (Sandbox Code Playgroud)

另一个在知道文件名时行为不同的可执行文件是wc单词counter程序:

$ 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
Run Code Online (Sandbox Code Playgroud)


den*_*ren 5

第一:

cat filename | grep regex
Run Code Online (Sandbox Code Playgroud)

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

第二个:

grep regex filename
Run Code Online (Sandbox Code Playgroud)

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


iab*_*der 0

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