关于管道输出的 UNIX 作业问题,我不明白它在问什么?

Dac*_*Asf -11 shell io-redirection

基本上,我需要想出一个命令,将文件的内容发送xxx到程序中yyy,然后将输出通过管道传输到另一个程序的输入,然后将输出zzz附加到文件中xyz

slm*_*slm 7

总是试着把事情分解成最简单的步骤,然后再试着把事情放在一起。为了开始第一部分,我会为自己构建一个示例文件。

$ echo -e "line 1 ABA\nline 2 ABB\nline 3 CCC\n" > xxx
$ cat xxx 
line 1 ABA
line 2 ABB
line 3 CCC
Run Code Online (Sandbox Code Playgroud)

所以现在我们有文件xxx. 现在我们需要使用一些可以充当程序的东西yyy。Unix 充满了可以作为替代的命令,所以让我们grep现在选择。Grep 会找到我们告诉它我们正在寻找的字符串,所以让我们告诉它查找包含“AB”的字符串。

$ cat xxx | grep AB
line 1 ABA
line 2 ABB
Run Code Online (Sandbox Code Playgroud)

所以我们刚刚满足了前两个要求。

  • cat xxx发送文件的内容xxx
  • cat xxx | grep AB将内容发送到程序,yyy

所以下一点,“将输出通过管道传输到另一个程序的输入zzz”,也应该相当简单,因为它与我们使用类似grep. 所以让我们grep像这样使用另一个:

$ cat xxx | grep AB | grep BB
line 2 ABB
Run Code Online (Sandbox Code Playgroud)

太好了,我们快到了。我们刚刚完成了第三个要求。

  • cat xxx | grep AB | grep BB将输出grep AB作为输入,并生成自己的输出。

所以最后一点,我们只需要附加来自zzz,即的输出grep BB。这很容易。如果您注意到我们如何构造初始文件,xxx我们使用了文件重定向>,它将从命令中获取输出并将其转储到文件中。重定向器>将覆盖包含内容的文件,即使它已经存在。但是我们需要追加。幸运的是,我们可以使用另一个重定向器>>. 这会将命令的输出附加到已存在的文件中。

说到已经存在,我们需要构造 file xyz。所以让echo我们使用我们用来制作的方法xxx

$ echo -e "previous line 1\nprevious line 2" > xyz
$ cat xyz 
previous line 1
previous line 2
Run Code Online (Sandbox Code Playgroud)

现在让我们附加我们一直在构建的命令的输出:

$ cat xxx | grep AB | grep BB >> xyz
Run Code Online (Sandbox Code Playgroud)

我们可以检查我们的结果:

$ cat xyz 
previous line 1
previous line 2
line 2 ABB
Run Code Online (Sandbox Code Playgroud)

我们已经完成了。