2016-12-27 47 views
-3

提取关键字我有一个日志其中有这样的:从日志行

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

我需要提取包含上述日志中的所有行,仅打印remote=.后的IP。这将是东西在模式:

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

你有什么试过?我们大多数人都很乐意帮助你改进自己的技艺,但不愿意担任短期无偿编程人员。在[MCVE](http://stackoverflow.com/help/mcve)中向我们展示您的工作,您期待的结果以及您获得的结果,我们将帮助您弄清楚。 – ghoti

+0

[从字符串中提取模式]的可能的重复(http://stackoverflow.com/questions/11533063/extract-pattern-from-a-string) – tripleee

+1

代表接近2K的代表的用户现在应该知道不要[问紧急志愿者](http://meta.stackoverflow.com/q/326569/472495)。 – halfer

回答

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

打印任何东西。

,或者使用背面sed引用:在这里的线被分为三个部分/基团,其将在后面由\1\2\3称作。每组由()包围。这里IP地址属于第二组,所以整行被第二组IP地址替换。

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

或者使用awk

awk -F'/|]]' '/client connection/{print $2}' input 
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是分裂的第二项。

1

使用grep:

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

o是只提取图案,而不是整条生产线。 P是与perl类似的正则表达式。在这种情况下,我们使用“负面后顾”。它会尝试匹配字符集是不是“]”,这是由remote=/

+1

更强大的方法是将'client connection'模式包含到'grep'中,因为这是OP所需要的。您的逻辑也可能包含在同一行中没有“客户端连接”的行。 – Inian

0

更健壮的方式preceeded,在this answer改进将在PCRE模式-P也使用GNU grepperl风格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比赛无论是在线条图案,并从文件中提取IP。 \K是一个PCRE语法,可以忽略直到该点的字符串,并仅打印其后面的捕获组。

(\d{1,3}\.){3}\d{1,3} 

为了匹配IP即3组由从13长度的点,接着4th八位字节分开数字。在包含client connection线remote=/和最亲密的]之间

0

用awk: 能否请您尝试以下,让我们知道如何去即可。

awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/);if(substr($0,RSTART,RLENGTH)){print substr($0,RSTART,RLENGTH)}}' Input_file