Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex sed-如何使用sed提取IP地址?_Regex_Sed_Grep - Fatal编程技术网

Regex sed-如何使用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

给定一个文件消息,如何提取所有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
,你也应该有
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
这些字符包括:

  • 使用括号的组:
  • 出现括号:
    {
    }
  • “或”管道:
    |
  • 非贪婪问号:
通常(虽然不是针对您的情况)我使用以下方法来匹配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
你也可以这样做:

窗口:

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