Regex sed-如何使用sed提取IP地址?
这是一个作业,所以我别无选择,只能使用sed 给定一个文件消息,如何提取所有IP地址并打印它们 我第一次试过Regex sed-如何使用sed提取IP地址?,regex,sed,grep,Regex,Sed,Grep,这是一个作业,所以我别无选择,只能使用sed 给定一个文件消息,如何提取所有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不支持非贪婪操作符,比如?和| 我一直在绞尽脑汁,但我想不出一个没有非贪婪操作符的方法来实现这一点。我怎样才能做到这一点?在那里更合适(如果你
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不支持非贪婪操作符,比如?和|
我一直在绞尽脑汁,但我想不出一个没有非贪婪操作符的方法来实现这一点。我怎样才能做到这一点?在那里更合适(如果你有sed
,你也应该有grep
):
这是您自己的
regex
,无需修改(测试正常)使用sed-r
(扩展regex)或使用\
退出捕获组如果您有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
这些字符包括:
- 使用括号的组:
,(
)
- 出现括号:
,{
}
- “或”管道:
|
- 非贪婪问号:
?
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
你也可以这样做:
窗口:
ipconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '2 d' | head -n1;
OSX:
如果在
Windows
上使用gitbash
。它很方便
export LC_ALL=C; ipconfig | sed -n 's/IPv4//gp;' | sed -En 's/.*(10.*)/\1/gp'
脚本只会给您10
前缀ip
地址10.11.68.42
脚本可以解释为
匹配行包含IPv4
,并将IPv4
替换为空白并打印,
然后捕获前缀为10
的内容并打印出来
使用
sed-r
。它确实支持你所说的。非常感谢,效果很好。我想我没有做足够的研究。记住,-r
标志是一个GNU-sed
扩展。它不适用于其他SED。请注意,您的正则表达式将允许09.08.07.06
作为有效的IP地址。Classic(POSIX)不支持ERE使用|
操作符。我没有否决你的答案,但OP说他必须使用sed
。所以这可能就是原因。然而,我同意你的看法,grep
比sed-n'/…/p
更合适。实际上,有一个区别。很难看出OP到底想做什么。您的grep
代码将仅返回IP地址。OP实际上可能正在尝试匹配和打印包含IP地址的行。这可能是投票失败的原因。谢谢!我从来没有注意过-o
grep选项,总是使用sed
进行提取,而在大多数情况下,我似乎可以使用grep
!这是一个非常好的答案,它帮助了我。这就是说,我需要从一个文本文件中提取IP地址和范围,如123.456.789.0/12
,这里提供的这个regex变体适用于我的情况<代码>([0-9]|[1-9][0-9]|[1-9][0-9][2]2[0-4][0-9][25[0-5])\{3}([0-9]|[1-9][0-9][1[0-9]{2}2[0-4][0-9][25[0-5])\/?([0-9][1,2]);我只是简单地将\/?([0-9]{1,2})
添加到了答案regex中。上述命令都不适用于echo ksjbfjasbhdf10.0.0.10sckksjdnc>文件@MaximKostrikin:如果包含IP地址,这些命令将打印整行。要仅提取有效的IP地址,我通常会使用以下解决方案之一:
ifconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '1 d' | head -n1;
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