使用grep通过日志查找模式并输出到文件

时间:2013-12-19 19:54:48

标签: regex grep

我正在尝试创建一个脚本,通过一些日志来获取特定模式,即:“HelloWorld”。日志位于我可以访问的不同服务器上。我已经能够收集信息并输出到文件,但为了提高效率,我希望能够对找到实例的次数进行编号/索引,同时仍然显示找到的模式。

这就是我所拥有的:

#!/bin/bash
ips=(*array containing the ip addresses of the servers*)
for j in ${ips[*]}
do
       result=$(ssh abcuser@"$j" "grep -R -i 'HelloWorld' /user/home/doc/abc.log" 2>&1)
       echo "$j has the following errors:
$result"
done

这可以完成我90%的任务,但是10%是我真正想要的。我知道我可以使用| wc -l来计算实例数但我丢失了输出文件上的模式。

使用此代码,这就是我得到的:

*ip_1* has the following errors:
2013-12-19 06:37:16,941 HelloWorld error, invoking the handler
2013-12-19 08:30:18,008 [WARN ] HelloWorld invoking error handler
*ip_2* has the following errors:
2013-12-19 13:37:16,941 [WARN ] HelloWorld invoking error handler
2013-12-19 15:30:18,008 HelloWorld error, invoking the handler

但是,以下是我想要的:

*ip_1* has the following errors:
1-2013-12-19 06:37:16,941 HelloWorld error, invoking the handler
2-2013-12-19 08:30:18,008 [WARN ] HelloWorld invoking error handler
*ip_2* has the following errors:
1-2013-12-19 13:37:16,941 [WARN ] HelloWorld invoking error handler
2-2013-12-19 15:30:18,008 HelloWorld error, invoking the handler

一个数字索引,告诉我每个服务器有多少个实例,是否可能?如果是的话,任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

在for循环中,我会有这样的东西:

echo "$j has the following errors:"
ssh abcuser@"$j" "grep -R -i 'HelloWorld' /user/home/doc/abc.log" | cat -n

格式与您指定的格式略有不同。如果您真的需要这种格式,可以在“cat -n”之后添加以下内容。

| sed -r 's/^\s*([0-9]+)\s*/\1-/'