grep -o 的问题

grep -o 的问题

我有一个文本文件,如下所示。

    192.168.10.1
   192.168.45.45
    192.168.255.255
    192.168.0.5
    Random text comes here   8.8.8.8
    224.23.25.12
    225.1.2.3
    226.0.0.0
    227.1.2.6
    227.25.25.26
    228.145.123.45
    229.255.255.255

Random text come here 172.32.255.255
231.25.12.12
232.45.13.45
238.0.0.0
233.1.2.3
234.255.255.255
236.123.123.123
237.153.125.155
235.235.235.255
239.239.239.10
172.21.255.255
172.31.10.10
172.16.32.21
Random text comes here 206.32.14.25

我正在使用 grep 命令来过滤所有公共 IP 地址。我的输出应该是这样的

8.8.8.8
172.32.255.255
206.32.14.25

如果我不使用 -o 标志,我的代码工作得很好。但是如果我添加 -o 标志来仅获取模式,我不会得到任何输出。

代码

egrep -vo  '172\.1[6-9]([\.][0-9]{1,3}){2}|172\.2[0-9]([\.][0-9]{1,3}){2}|172\.3[01]([\.][0-9]{1,3}){2}|10([\.][0-9]{1,3}){3}|192\.168([\.][0-9]{1,3}){2}|22[456789]([\.][0-9]{1,3}){3}|23[0-9]([\.][0-9]{1,3}){3}' private_ip

任何对此的帮助将不胜感激。谢谢

答案1

正如您当前的示例所示,使用 GNU sed

% sed -nr 's/^#.*\s([^\s]+)$/\1/p' file.txt 
8.8.8.8
172.32.255.255
206.32.14.25

或者grep使用 PCRE:

% grep -Po '^#.*\s\K[^\s]+$' file.txt
8.8.8.8
172.32.255.255
206.32.14.25

答案2

如果公共 IP 始终与文本“Hello I am public IP”位于同一行,您可以awk这样使用:

awk '/Hello I am public IP/ {print $6}'

行开头的空格将被忽略,$6这些行上的第六个空格分隔字段也将被忽略。

相关内容