如何使用 Linux 管道进行重定向

管道是 Linux 中的一种重定向形式,用于将一个命令的 STDOUT 连接到第二个命令的 STDIN。 它允许我们缩小一串命令的输出范围,直到我们拥有易于消化的数据量。 管道字符是 | 符号并放置在任意两个命令之间。 管道是 Linux 拥有的最常用的命令行功能之一。 每篇展示 Linux 命令的文章几乎都不可避免地包含管道。

管道语法

管道语法将一个命令的标准输出重定向到另一个命令或程序。 下面是使用管道重定向组合命令的示例。

command_a | command_b | command_z 

管道命令和管道命令有什么区别?

Linux 管道 命令用于将程序的输出传递到另一个程序的输入。 管道将一个命令的输出重定向到另一个命令。 在第一个示例中,我们看到了管道命令。

command1 > command2  vs  command1 | command2

在第二个示例中,我们看到了一个将命令通过管道传输到另一个命令的示例。

管道示例

我创建了十个名为“File_n”的文件,其中 n 是文件的编号。 ls -l 命令将显示这些文件并包括每个文件的名称、权限、所有权、大小以及它们的创建日期和时间。

 ls -l | awk '{print $9}' | grep 10

在上面的例子中, ls -l 将显示当前文件夹中的所有文件。 管道将命令的输出重定向到下一个命令。 只有第 9 个字符串(由空格分隔)将显示在包含 10 的行的末尾。上面的示例显示了管道的用处以及如何将某些命令连接在一起。 我使用随机数据创建了自己的访问日志,以从组合不同的命令中提取特定信息。

在日志文件上使用管道

首先,让我们看看文件的结构。 我将使用 tail 命令从访问日志中获取最后 10 行。

 tail access_log

如下图所示,我们有 IP 地址、请求时间、请求类型以及他们尝试访问的 URL。

让我们看看来自哪个 IP 的请求最多。

 awk '{print $1}' access_log | sort -n | uniq -c | sort -rn

然后,使用 awk 命令,我们将提取每一行的第一个值(即 IP)并将管道的结果传递给下一个命令。 命令 sort -n 将 IP 从低到高重新排列,但我们只会看到 n 个相同 IP 的块。

要计算这些块中有多少相同的 IP,我们可以将结果传递给 uniq -c 命令。 -c 标志用于计算相同的值。 如果我们想从最高到最低的请求数排序,我们可以使用 sort-rn 命令。 我们可以看到 IP“1.2.3.9”有 28 个请求。 使用 POST 或 GET 请求查看网站的哪一部分被访问。

Linux 管道 3

以下命令可用于确定 IP 是否尝试对您的网站进行暴力破解。

 grep "1.2.3.9" access_log | grep POST | wc -l
Linux 管道 4

我们可以使用 grep 命令仅获取包含 IP“1.2.3.9”的行,将所有这些行传递给下一个 grep 命令以仅检查 POST 请求,并使用 wc -l 命令计算所有行。 在 28 个请求中,发出了 16 个 POST 请求。 让我们稍微展开一下,看看 POST 请求是在哪里发出的。

 grep "1.2.3.9" access_log | grep POST | awk '{print $4}' | sort | uniq -c | sort -rn
Linux 管道 5

wc 命令被删除并替换为 awk ‘{print $4}’ | 排序 | uniq -c | sort -rn 命令。 我们可以剖析下面的命令。

  • 命令 awk ‘{print $4}’ 将只输出 URL。
  • sort 命令将按字母顺序对 URL 进行排序。
  • 命令 uniq -c | sort -rn 将按请求数对所有行进行计数和排序。

命名管道

到目前为止,我们已经讨论了如何使用未命名管道,这些管道是即时创建的,并且只有在使用它们的命令正在运行时才存在。 现在我们继续讨论命名管道。 名称管道在文件系统中显示为持久对象,即使在系统重新启动后也不会被删除。 命名管道可以使用 ls 命令定位。 要创建命名管道,我们需要使用 mkfifo 命令。

 mkfifo liquid_pipe

使用 ls -l 命令,我们可以查看命名管道的详细信息。 第一个字符“p”表示“liquid_pipe”是一个管道。 最常见的第一个字符将是目录的“d”和常规文件的“-”。

Linux 管道 6

需要两个终端来显示如何使用命名管道。 一个设置在“mstevens”和用户上,而另一个设置为“root”。 重用前面示例中的 access_log 将所有数据添加到命名管道。 数据将“卡住”在新行上,这表明正在发生某些事情,并且将保持这种状态,直到读取来自命名管道的数据为止。

 cat access_log > liquid_pipe
Linux 管道 7

在另一个终端中,使用 tail 函数从命名管道中提取最后 10 行。

 tail liquid_pipe

tailliquid_pipe 和 tailaccess_log 的两个输出都提供相同的信息。 唯一的区别是第一个终端将您返回到命令提示符。

Linux 管道 8

使用 & 符号在后台运行 cat access_log >liquid_pipe 时会发现相同的信息,这允许我们以同一用户身份继续工作。

Linux 管道 9

结论

使用未命名的管道将帮助您创建单行代码以获取特定数据。 命名管道现在不是标准做法,因为使用未命名管道无需额外步骤即可实现相同的结果。 如果没有管道,将需要多个命令,并且结果必须存储在不同的文件中才能获得您需要的一行。 练习管道的最佳方法是在您之前的命令之后添加一个管道。 它将提供您想要的结果,而不是检查您的多个命令中的哪个不起作用。

我们的支持团队由才华横溢的 Linux 技术人员和系统管理员组成,他们对多种网络托管技术(尤其是本文中讨论的技术)了如指掌。 如果您是完全托管的 VPS 服务器, Cloud 专用,VMWare 私有 Cloud、私有父服务器或专用服务器所有者,并且您对执行任何概述的步骤感到不舒服,可以通过电话联系我们 @800.580.4985,a 在线聊天,或支持票以帮助您了解有关此主题的更多信息!