Linux bash+;如何从线路中捕获IP地址

Linux bash+;如何从线路中捕获IP地址,linux,bash,perl,awk,Linux,Bash,Perl,Awk,我有很多配置文件, 以行字开头的行具有IP地址 我的目标是从文件中读取以line word开头的行,并仅打印IP地址 问题是IP地址可以位于行中的任何字段中,因此我无法根据字段号捕获IP 范例 grep LINE file1.txt LINE /home/Ariate/run.pl "Voda STS 4 Test - " "102841" && ssh 17.77.170.130 -p 2022 grep LINE file2.txt LINE /home/Ari

我有很多配置文件, 以行字开头的行具有IP地址

我的目标是从文件中读取以line word开头的行,并仅打印IP地址

问题是IP地址可以位于行中的任何字段中,因此我无法根据字段号捕获IP

范例

grep LINE file1.txt

LINE /home/Ariate/run.pl "Voda STS 4 Test -  " "102841" && ssh 17.77.170.130 -p 2022 



grep LINE file2.txt

LINE /home/Ariate/run.pl 137.77.170.30 "Voda STS 4 Test -  " "102841" && ssh  ACTIVE
请建议如何从该行捕获IP地址(解决方案也可以使用perl one liner)

预期结果

echo $IP_FROM_LINE

17.77.170.130



echo $IP_FROM_LINE

137.77.170.30

使用此
grep-oE

grep -oE '\d+\.\d+\.\d+\.\d+' file
17.77.170.130
137.77.170.30
否则:

grep -oP '\d+\.\d+\.\d+\.\d+' file
火柴

17.77.170.130
137.77.170.30

如果您的
grep
支持
-p
选项

这两种方法都适用于您提供的数据

但是,如果你真的担心什么是匹配的,使用

grep -Eo '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'

将匹配excat ip地址。

以下内容将为您提供所需的ip地址:

grep -oP '^LINE.*\b\K\d+\.\d+\.\d+\.\d+' file
要将结果作为请求放入变量中,需要按如下方式迭代结果:

grep -oP '^LINE.*\b\K\d+\.\d+\.\d+\.\d+' file |
while read IP_FROM_LINE ; do
    echo $IP_FROM_LINE
done

显示的输出是在数据上运行复制/粘贴。您也可以尝试:
grep-oP
这将匹配由“.”分隔的4个数字块组成的任何分组,其中许多将超出有效的ip地址范围0-255。@Maihabunah:很高兴知道这是可行的。当然,我很简单,可以避免使用复杂的正则表达式来验证所有边缘情况。@ikegami贪婪匹配将捕获最后一个ip,如果同一行上有多个ip(并且可能有回溯)。这是个问题吗
*?
将通过添加字符来查找第一个字符来回溯
*
将通过删除字符以查找最后一个字符来回溯。
grep -Eo '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
grep -oP '^LINE.*\b\K\d+\.\d+\.\d+\.\d+' file
grep -oP '^LINE.*\b\K\d+\.\d+\.\d+\.\d+' file |
while read IP_FROM_LINE ; do
    echo $IP_FROM_LINE
done