命令行快速提示:使用管道连接工具

Linux 最强大的概念之一是从其前身 UNIX 继承而来的。 您的 Fedora 系统有一堆有用的、单一用途的实用程序可用于各种简单的操作。 就像积木一样,您可以以创造性和复杂的方式附加它们。 管道是这个概念的关键。

不过,在您听说管道之前,了解输入和输出的基本概念会很有帮助。 您的许多实用程序 Fedora 系统可以对文件进行操作。 但他们通常可以接受未存储在磁盘上的输入。 您可以将输入自由流入诸如实用程序之类的进程作为其标准输入(有时也称为标准输入)。

同样,默认情况下,工具或流程可以将信息显示到屏幕上。 这通常是因为它的默认输出连接到终端。 您可以将流程的自由流动输出视为​​其标准输出(或标准输出——看图!)。

标准输入输出示例

通常,当您运行工具时,它会输出到终端。 以这个使用 seq 工具的简单序列命令为例:

$ seq 1 6
1
2
3
4
5
6

输出,即从 1 到 6 的整数计数,每行一个数字,出现在屏幕上。 但您也可以使用 > 特点。 shell 解释器使用这个字符来表示“将标准输出重定向到名称后面的文件”。 所以你可以猜到,这个命令将输出放入一个名为 Six.txt 的文件中:

$ seq 1 6 > six.txt

注意屏幕上什么都没有。 您已将输出发送到文件中。 如果您运行命令 cat Six.txt,您可以验证这一点。

您可能还记得上一篇文章中 grep 命令的简单用法。 您可以通过简单地声明文件名来要求 grep 在文件中搜索模式。 但这只是 grep 中的一个便利功能。 从技术上讲,它的构建是为了接受标准输入并进行搜索。

外壳使用 < 字符类似于表示“从名称后面的文件重定向标准输入”。 所以你也可以搜索号码 4 以这种方式在文件 Six.txt 中:

$ grep 4 < six.txt
4

当然,这里的输出默认是任何匹配的行的内容。 所以 grep 找到数字 4 在文件中并将该行输出到标准输出。

介绍管道

现在想象一下:如果您获取一个工具的标准输出,而不是将其发送到终端,而是将其发送到另一个工具的标准输入,该怎么办? 这就是管道的本质。

您的外壳使用竖线字符 | 表示两个命令之间的管道。 您可以在反斜杠上方的大多数键盘上找到它 特点。 它是这样使用的:

$ command1 | command2

对于大多数简单实用程序,您不会在 command1 上使用输出文件名选项,也不会在 command2 上使用输入文件选项。 (不过,您可以使用其他选项。)您将 command1 的输出直接发送到 command2,而不是使用文件。 您可以根据需要在一行中使用任意数量的管道,从而连续创建多个命令的复杂管道。

这个(比较没用) example 结合上面的命令:

$ seq 1 6 | grep 4
4

这里发生了什么? seq 命令输出整数 1 到 6,一次一行。 grep 命令逐行处理输出,在数字上搜索匹配 4,并输出任何匹配的行。

这里有一个稍微有用的 example. 假设您想查明 TCP 端口 22(即 ssh 端口)是否在您的系统上打开。 您可以使用 ss 命令* 通过查看其丰富的输出来发现这一点。 或者你可以找出它的过滤器语言并使用它。 或者你可以使用管道。 为了 example,通过 grep 管道查找 ssh 端口标签:

$ ss -tl | grep ssh
LISTEN  0    128     0.0.0.0:ssh       0.0.0.0:*     
LISTEN  0    128     [::]:ssh          [::]:*

* 那些熟悉古老的 netstat 命令的读者可能会注意到它大多已过时,如其 手册页.

这比阅读多行输出要容易得多。 当然,您可以组合重定向器和管道,例如:

$ ss -tl | grep ssh > ssh-listening.txt

这几乎不会刮伤管道的表面。 让想象力自由驰骋。 玩得开心管道!