如何使用 egrep 搜索包含所有短语的字符串


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'

您可能需要调整第一种模式,具体取决于顺序或元素,以及它们之间应该是什么。

最新更新