这是一个赋值,所以我别无选择,只能使用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不支持像?和?这样的非贪婪运算符|.我一直在绞尽脑汁,但我想不出一种方法来做到这一点,没有非贪婪的运营商。我怎么能做到这一点?
lnlaulya1#
grep在这里更合适(如果你有sed,你也应该有grep):
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,没有修改(测试正常)
regex
f45qwnt82#
如果你有GNU sed,你可以简单地添加-r标志来使用ERE:
GNU sed
-r
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
wgx48brx3#
使用sed -r(扩展正则表达式)或使用\转义捕获组
sed -r
\
7tofc5zh4#
你也可以这样做:窗口:
ipconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '2 d' | head -n1;
OSX:
ifconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '1 d' | head -n1;
参考:https://perldoc.perl.org/perlrun
-n
-l
-e
oaxa6hgo5#
如果你在Windows上使用git-bash。这是相当方便的。
Windows
git-bash
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的内容并打印
10
ip
10.11.68.42
IPv4
gv8xihay6#
Cygwin:
ping -n 1 www.ip.com | sed -n '2,/[0-9]/ s/.*\( [0-9]\+\(\.[0-9]\+\)\{3\}\).*/\1/p' | tr -d ' '
6条答案
按热度按时间lnlaulya1#
grep在这里更合适(如果你有
sed
,你也应该有grep
):这是您自己的
regex
,没有修改(测试正常)f45qwnt82#
如果你有
GNU sed
,你可以简单地添加-r
标志来使用ERE:否则,您需要转义某些字符:
这些字符包括:
(
、)
{
、}
|
?
一般情况下(虽然不适合您的情况)我使用以下方法来匹配IP地址:
或在兼容模式下:
wgx48brx3#
使用
sed -r
(扩展正则表达式)或使用\
转义捕获组7tofc5zh4#
你也可以这样做:
窗口:
OSX:
参考:https://perldoc.perl.org/perlrun
-n
:在命令周围放置一个非打印循环。-l
:启用自动行结束处理-e
:允许你以参数的形式而不是文件的形式提供程序,你不想为每一个Perl小程序都创建一个脚本文件。oaxa6hgo5#
如果你在
Windows
上使用git-bash
。这是相当方便的。该脚本只会给予你
10
前缀ip
地址10.11.68.42
。脚本可以解释为
匹配行包含
IPv4
,用空白替换IPv4
并打印,然后捕获前缀为10
的内容并打印gv8xihay6#
Cygwin: