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

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

管道语法

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

command_a | command_b | command_z 

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

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

command1 > command2 
vs 
command1 | command2

在第二 example,我们看到一个 example 将一个命令传递给另一个命令。

管道示例

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

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

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

在日志文件上使用管道

首先,让我们看看文件的结构。 我将使用 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}’ | 排序 | 唯一的-c | 排序 -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 example 将所有数据添加到命名管道。 数据将“卡”在新行上,这表明正在发生某些事情,并且它将一直保持这种状态,直到读取来自命名管道的数据。

 cat access_log > liquid_pipe
Linux 管道 7

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

 tail liquid_pipe

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

Linux管道8

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

Linux 管道 9

结论

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

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