从日志行中提取关键字

时间:2016-12-27 05:12:15

标签: linux sed grep

我有一个这样的日志:

.....client connection.....remote=/xxx.xxx.xxx.xxx]].......

我需要提取包含上述内容的日志中的所有行,并在remote=.之后打印ip。这将是模式中的一些东西:

grep "client connection" xxx.log | sed -e ....

4 个答案:

答案 0 :(得分:1)

使用grep:

grep -oP '(?<=remote=/)[^\]]+' file

o仅提取模式,而不是整行。  P就像正则表达式一样匹配perl。在这种情况下,我们使用“负面看后面”。它将尝试匹配不是“]”的字符集,其前面是remote=/

答案 1 :(得分:0)

试试这个:

grep 'client connection' test.txt | awk -F'[/\\]]' '{print $2}'

测试用例

test.txt
---------
abcd
.....client connection.....remote=/10.20.30.40]].......
abcs
.....client connection.....remote=/11.20.30.40]].......
.....client connection.....remote=/12.20.30.40]].......

<强>结果

10.20.30.40
11.20.30.40
12.20.30.40

<强>解释

grep会将结果列入仅匹配客户端连接的行。 awk使用-F标记作为分隔符来分割文本。我们要求awk使用/]分隔符来分割文字。为了使用多个分隔符,我们将分隔符放在[]中。例如,要按=:拆分文字,我们会[=:]

但是,在我们的案例中,其中一个分隔符为],因为我的目的是通过将文本随/x.x.x.x]/分散来专门从]中提取IP。所以我们逃避它]。 IP是拆分中的第二项。

答案 2 :(得分:0)

一种更强大的方法,改进超过this answer,也可以GNU grep模式PCRE使用-P perl regEx样式grep -oP "client connection.*remote=/\K(\d{1,3}\.){3}\d{1,3}" file 10.20.30.40 11.20.30.40 12.20.30.40 匹配,但匹配问题中建议的两种模式。

client connection.*remote

在这里,\K匹配行中的模式并从文件中提取IP。 PCRE(\d{1,3}\.){3}\d{1,3} 语法,用于忽略到该点的字符串,并仅打印其后的捕获组。

3

匹配IP 1数字组,以34th后跟$("#success").show(); setTimeout(function() { $("#success").hide(); }, 5000); 八位字节的长度点分隔。

答案 3 :(得分:0)

grep -oP 'client connection.*remote=/\K.*?(?=])' input

在包含remote=/的行上的]和最近client connection之间打印任何内容。

或者使用sed反向引用:此处该行分为三个部分/组,稍后由\1 \2\3引用。每个小组都被()括起来。这里IP地址属于第二组,因此整行被替换为IP地址的第二组。

sed -r  '/client connection/ s_(^.*remote=/)(.*?)]](.*)_\2_g' input

或使用awk

awk -F'/|]]' '/client connection/{print $2}' input