Linux 从日志行中提取关键字

Linux 从日志行中提取关键字,linux,sed,grep,Linux,Sed,Grep,我有一个日志,它是这样的: .....client connection.....remote=/xxx.xxx.xxx.xxx]]....... 我需要提取日志中包含上述内容的所有行,并在remote=.之后仅打印ip。。这将是一种模式: grep "client connection" xxx.log | sed -e .... 试试这个: grep 'client connection' test.txt | awk -F'[/\\]]' '{print $2}' 测试用例 结果 解

我有一个日志,它是这样的:

.....client connection.....remote=/xxx.xxx.xxx.xxx]].......
我需要提取日志中包含上述内容的所有行,并在remote=.之后仅打印ip。。这将是一种模式:

grep "client connection" xxx.log | sed -e ....
试试这个:

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

结果

解释

grep将只在匹配客户端连接的行中筛选结果。awk使用-F标志作为分隔符来分割文本。我们要求awk使用/和]分隔符分割文本。为了使用多个分隔符,我们将分隔符放在[和]中。例如,要将文本拆分为=和:,我们需要执行[=:]

但是,在我们的例子中,其中一个分隔符是“],因为我的目的是通过使用/and]插入文本来从/x.x.x.x]中提取IP。所以我们逃避它。IP是拆分的第二项。

使用grep:

grep -oP '(?<=remote=/)[^\]]+' file
o是只提取模式,而不是整条线。
P是与perl类似的regex匹配。在这种情况下,我们使用的是“反向向后看”。它将尝试匹配remote=/

前面没有的字符集。一种更健壮的方法是,在PCRE模式下使用GNU grep和-p进行perl风格的正则表达式匹配,但按照问题中的建议匹配这两种模式

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组数字,由长度为1到3的点分隔,后跟第4个八位字节

在包含客户端连接的行上打印远程=/和最近]之间的任何内容

或者通过使用sed反向引用:此处,该行被分为三个部分/组,稍后由\1\2或\3引用。每组由和组成。这里的IP地址属于第二组,所以整条线路被第二组IP地址取代

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


一种更健壮的方法是将模式客户机连接包括到grep中,因为这正是OP所需要的。您的逻辑还可能包括在同一行中没有客户端连接的行。您尝试了什么?我们这里的大多数人都很乐意帮助您改进您的技能,但不太乐意担任短期无薪编程人员。向我们展示您到目前为止的工作,您期望的结果和您得到的结果,我们将帮助您解决问题。如果用户的代表人数接近2K,则可能会出现重复,现在应该知道不要这样做。
(\d{1,3}\.){3}\d{1,3}
grep -oP 'client connection.*remote=/\K.*?(?=])' input
sed -r  '/client connection/ s_(^.*remote=/)(.*?)]](.*)_\2_g' input
awk -F'/|]]' '/client connection/{print $2}' input