我想知道下面两个命令之间的区别,我明白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)
第一:
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,则匹配正则表达式。
| 归档时间: |
|
| 查看次数: |
29863 次 |
| 最近记录: |