egrep -c LOGIN wrapper.log|egrep -c failed wrapper.log
|egrep -c '[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}' wrapper.log
|egrep -cv mymathworks wrapper.log|egrep -cv nacmpa wrapper.log > failed-login.txt
是我目前拥有的。我只需要返回一个文件中的行数,其中包含 LOGIN、failed、IP 地址模式,并且不包含 mymathworks 或 nacmpa。
当前正则表达式仅返回文件中的行数,而不返回 nacmpa。
egrep 的-c
选项仅打印计数,而不是内容,即在获得计数后LOGIN
计数,failed
计数将永远不会匹配(因为任何数字都不匹配文本failed
)。将管道分解为多个部分可能有助于您解决问题。
简短回答:您应该只在堆线的第一egrep
上列出输入文件(wrapper.log),并且只应在最后一个上给出-c
选项。另外,我很确定您可以简化它以使用更少的管道阶段。
长答案:要了解出了什么问题,让我们看看管道的前几个阶段会发生什么。管道中的第一个命令是
egrep -c LOGIN wrapper.log
。搜索包装器.log并打印包含"LOGIN"的行数。不是包含"登录"的行,只是行数。
下一个命令是
egrep -c failed wrapper.log
。搜索包装器.log并打印包含"失败"的行数。它不会从其输入中读取,因此第一个egrep
的输出被完全忽略。即使它确实读取了它,它也只有行数,因此无法判断其中有多少行也包含"失败"。
解决方案:从第一个egrep
中删除-c
,以便打印实际匹配的行,并从第二个中删除wrapper.log
,以便它搜索第一个egrep
的输出,而不是返回并重新读取原始文件。管道的所有其他阶段都会出现相同的问题,因此您需要从除第一个阶段之外的所有阶段中删除wrapper.log
(因此其他阶段实际上从管道中读取),并从除最后一个阶段之外的所有阶段中删除-c
(因此仅在完成所有筛选后进行计数)。
但正如我所说,我怀疑管道可以简化很多。"登录"、"失败"和 IP 地址是否总是以相同的顺序出现在行中?如果是这样,请创建一个包含所有这些的模式。对于"mymathworks"和"nacmpa",您可以使用模式mymathworks|nacmpa
一次删除两者。所以你应该能够使用这样的东西:
egrep 'LOGIN.*failed.*[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}' wrapper.log
| egrep -cv 'mymathworks|nacmpa'
您可能需要调整第一种模式,具体取决于顺序或元素,以及它们之间应该是什么。