有人可以解释一下这个命令发生了什么:日志文件结构:
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
并将其作为值返回max
,grep
然后在中进行搜索logfile
。
从grep
找到的结果中,cut
再次调用以返回第 1、3 和 4 列,然后按sort
字母顺序排序并修剪以uniq
仅显示唯一的结果。
答案2
第一行设置了一个名为 max 的环境变量,然后 grep 调用该变量。$ 引用您在第一行中设置的变量。
尝试echo $USER
或echo $HOME
查看一些其他环境变量。