bash +如何从线上捕获IP地址

时间:2014-10-27 14:35:56

标签: linux bash perl awk

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

我的目标是从文件中读取以LINE字开头的行并仅打印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

4 个答案:

答案 0 :(得分:2)

perl -MRegexp::Common=net -lne 'print $1 if /^LINE.*\b($RE{net}{IPv4})/'

答案 1 :(得分:1)

使用此grep -oE

grep -oE '\d+\.\d+\.\d+\.\d+' file
17.77.170.130
137.77.170.30

或者其他:

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

答案 2 :(得分:0)

grep -oE '[0-9]{2,3}(\.[0-9]{2,3}){3}'

匹配

17.77.170.130
137.77.170.30

grep -oP '\d{2}(\.\d{2}){3}'

如果您的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地址。

答案 3 :(得分:0)

以下内容将为您提供所需的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