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

[ad_1]

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

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

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

标准输入输出示例

通常,当您运行工具时,它会输出到终端。 以使用 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。 您可以根据需要在一行中使用尽可能多的管道,从而在一行中创建多个命令的复杂管道。

这个(相对无用的)例子结合了上面的命令:

$ seq 1 6 | grep 4
4

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

这是一个稍微有用的例子。 假设您想了解 TCP 端口 22(ssh 端口)是否在您的系统上打开。 您可以使用 ss 命令* 通过查看其大量输出来发现这一点。 或者你可以找出它的过滤语言并使用它。 或者你可以使用管道。 例如,通过 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

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

[ad_2]

Related Posts