我有一个这样的日志:
.....client connection.....remote=/xxx.xxx.xxx.xxx]].......
我需要提取包含上述内容的日志中的所有行,并在remote=.
之后打印ip。这将是模式中的一些东西:
grep "client connection" xxx.log | sed -e ....
答案 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
数字组,以3
到4th
后跟$("#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