使用grep并在模式之后获取文本

时间:2019-02-14 15:58:45

标签: linux grep

我需要从日志中获取IP,我需要grep true-client,然后我需要grep true-client-ip=[191.168.171.15]并仅获取IP

2019.02.14-08:26:06:713,asd:1234:chan,0.000,asd,S,request-begin-site,POST,{remoteHost=1.2.3.4,remoteAddr=1.2.3.4,requestType=POST,serverName=api=[text/html],accept-charset=[iso-12345-15, utf-8;q=0.5, *;q=0.5],accept-encoding=[gzip],server-origin=[5],cache-control=[no-cache, max-age=0],pragma=[no-cache],program-header=[true],te=[chunked;q=1.0],true-client-ip=[191.168.171.15],true-host=[www.server.com]

我正在尝试grep -o "true-client-ip=[^ ]*,",但它带来了我:

true-client-ip=[191.168.171.15],true-host=[www.server.com]

我只需要true-client-ip=[191.168.171.15],这样我就可以减少获得true-client-ip=[191.168.171.15] | cut -d= -f2之类的IP了

2 个答案:

答案 0 :(得分:1)

使用grep -P标志(如果可用):

grep -oP 'true-client-ip=\[\K[^]]*'

Perl的\K元字符在显示结果时会丢弃前面的内容,因此它将与“ true-client-ip = [”部分匹配,但仅显示IP。

如果grep -P不可用,我将使用sed

sed -nE 's/.*true-client-ip=\[([^]]*).*/\1/p'

答案 1 :(得分:1)

如果您有GNU grep,则可以这样操作:

$ grep -oP "(?<=true-client-ip=\[)[^\]]*" file
191.168.171.15

(?<=)被称为“积极向后看”,您可以找到相关的doc here
\中的反斜杠[^\]]实际上是不必要的,我只是想添加它以使其更直观,更不容易引起误解:-)。