Linux 命令管道 - grep 和匹配模式

Linux 命令管道 - grep 和匹配模式

有人可以解释一下这个命令发生了什么:日志文件结构:

IPsrc:IPdst:端口:数据包

@ max=`cut -f4 -d: logfile | sort -n -r | head -1`
grep "$max"$ logfile | cut -f1,3,4 -d: | sort | uniq

我不明白第一行如何用于定义 grep 的模式。

我正在使用 ubuntu 来测试这个。

任何链接/解释都是有帮助的。

virtual@virtual-VirtualBox:~$ @max='cut -f4 -d: intrulog | sort -n -r | head -1' grep   "$max"$ intrulog | cut -f1,3,4 -d: | sort | uniq
virtual@virtual-VirtualBox:~$ 

如您所见,当我执行这些命令时,grep 没有返回任何内容。如果我在第一行执行该命令,我会得到预期的输出,但在第一种情况下,$max 不会作为正确的过滤模式传递给 grep

virtual@virtual-VirtualBox:~$ cut -f4 -d: intrulog | sort -n -r | head -1
24
virtual@virtual-VirtualBox:~$ 

只是为了帮助未来的访问者 intrulog(IPsrc:IPdst:port:packets)的结构,减少到几行:

192.168.164.142:137.37.8.8:8080:5
192.168.160.37:137.37.8.5:8080:13
192.168.155.47:137.37.8.12:443:24
192.168.161.92:137.37.8.5:21:24
192.168.156.77:137.37.8.8:8080:13
192.168.164.84:137.37.8.9:8080:9

这些命令预计将返回 IPSrc、端口和​​数据包数量:

192.168.155.47:443:24
192.168.161.92:21:24

答案1

编辑(针对澄清的问题):

这些命令应该在两行上执行。我相信这其中也有拼写错误。我认为@max 之前的符号是不必要的。grep$命令中的第二个符号似乎也是不必要的。最后,在您的示例中,cut 命令周围的单引号应该是刻度标记(` 来自 ~ 键而不是 ')完整命令可能应该是(在单独的行上):

max=`cut -f4 -d: intrulog | sort -n -r | head -1`
grep "$max" logfile | cut -f1,3,4 -d: | sort | uniq

如果您想将其作为一行运行,请在其间添加分号。

原始答案:

max被分配了值cut -f4 -d: intrulog | sort -n -r | head -1,它按顺序执行以下操作:

  • cut被调用来处理文件,从以冒号 ( )intrulog分隔的集合中挑选出第四列:
  • sort被称为对输出进行排序,cut将最高的数字放在最上面
  • head被称为将输出减少到仅顶行。

总的来说,它基本上取所调用文件第四列中的最高值intrulog并将其作为值返回maxgrep然后在中进行搜索logfile

grep找到的结果中,cut再次调用以返回第 1、3 和 4 列,然后按sort字母顺序排序并修剪以uniq仅显示唯一的结果。

答案2

第一行设置了一个名为 max 的环境变量,然后 grep 调用该变量。$ 引用您在第一行中设置的变量。

尝试echo $USERecho $HOME查看一些其他环境变量。

相关内容