理解 linux 中的 grep 和管道

Raj*_*war 9 grep pipe files arguments

我遇到了这篇文章,它解释了我的问题。假设有一个名为file.txt“foo World”的文件。
泰勒发布的答案解释了很多,但我很困惑如何

cat file.txt | grep "foo"
Run Code Online (Sandbox Code Playgroud)

类似于

grep "foo" file.txt
Run Code Online (Sandbox Code Playgroud)

我认为grep需要以下内容

grep input argument  // input is the string to search for (i.e) foo and
                     //  argument is the file path (./file.txt)
Run Code Online (Sandbox Code Playgroud)

现在输出cat file.txt是文件的内容,foo World这成为grep?的输入?我对么?如果是这样,我认为grep需要一个文件路径作为字符串?

slm*_*slm 7

大多数命令可以处理输入,这些输入要么是它们需要打开以进行输入的文件,要么是作为通过 STDIN 传递给命令的数据流。

当 的内容cat file.txt通过管道 ( |)发送到另一个命令时,通过 STDOUT 传递到左侧管道的输出将被设置并馈送到管道 STDIN 右侧的命令。

如果内容不是通过 STDOUT -> STDIN 通过管道传递,则命令可以通过打开通过命令行参数按名称传递的文件来接收数据。

例子

将输出发送到 STDOUT。

$ cat file 
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

from 的输出cat file通过 STDOUTgrep通过管道发送到的 STDIN。

$ cat file | grep 5
5
Run Code Online (Sandbox Code Playgroud)

将文件作为命令行参数处理。

$ grep 5 file 
5
Run Code Online (Sandbox Code Playgroud)

直接通过 STDIN 处理文件内容。

$ grep 5 < <(cat file)
5
Run Code Online (Sandbox Code Playgroud)

在这里,我演示了file可以grep通过上面的 STDIN定向到的内容。