20

这是一个作业,所以我别无选择,只能使用 sed。

给定一个文件messages,我如何提取所有 IP 地址并打印它们?

我第一次尝试

sed -n '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' messages

但它什么也没打印。在做了一些研究后,我发现 sed 不支持非贪婪运算符,如 ? 和|。

我一直在绞尽脑汁,但如果没有非贪婪的运营商,我想不出办法做到这一点。我怎样才能做到这一点?

4

5 回答 5

40

在那里会更合适(如果你有sed,你也应该有grep):

grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])' messages

这是你自己的regex,没有修改(测试OK)

于 2013-02-18T02:28:21.953 回答
15

如果你有GNU sed,你可以简单地添加-r标志来使用 ERE:

sed -rn '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' file

否则,您将需要转义某些字符:

sed -n '/\(\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)/p' file

这些字符包括:

  • 使用括号的组:(,)
  • 出现大括号:{,}
  • “或”管道:|
  • 非贪婪问号:?

通常(尽管不适合您的情况)我使用以下内容来匹配 IP 地址:

sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' file

或者在兼容模式下:

sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p' file
于 2013-02-18T03:04:56.163 回答
9

使用sed -r(扩展正则表达式)或转义捕获组\

于 2013-02-18T02:33:52.380 回答
1

你也能做到:

视窗:

ipconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '2 d' | head -n1;

操作系统:

ifconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '1 d' | head -n1;
于 2016-02-11T11:42:29.703 回答
0

如果你git-bash使用Windows. 这很方便。

 export LC_ALL=C; ipconfig | sed -n 's/IPv4//gp;' | sed -En 's/.*(10.*)/\1/gp' 
以太网适配器 VMware Network Adapter VMnet1:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::3177:bf7b:590:c787%6
   IPv4 地址 . . . . . . . . . . . . : 192.168.31.1
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . :

以太网适配器 VMware Network Adapter VMnet8:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::c8de:747e:34fe:58cd%12
   IPv4 地址 . . . . . . . . . . . . : 192.168.239.1
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . :

以太网适配器 以太网:

   连接特定的 DNS 后缀 . . . . . . . : some.com
   本地链接 IPv6 地址. . . . . . . . : fe80::9d9:bb4d:e77a:3a98%15
   IPv4 地址 . . . . . . . . . . . . : 10.11.68.42
   子网掩码  . . . . . . . . . . . . : 255.255.254.0
   默认网关. . . . . . . . . . . . . : 10.11.168.1

该脚本只会为您提供10前缀ip地址10.11.68.42

该脚本可以解释为

匹配行包含IPv4并替换IPv4为空白并打印,然后捕获带有前缀的10内容并打印它

于 2020-08-14T05:40:51.393 回答