Linux bash+;如何从线路中捕获IP地址
我有很多配置文件, 以行字开头的行具有IP地址 我的目标是从文件中读取以line word开头的行,并仅打印IP地址 问题是IP地址可以位于行中的任何字段中,因此我无法根据字段号捕获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
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