如何在一条命令中将 IP 地址与 4 个八位位组或 3 个八位位组进行匹配?
目标 - 匹配 xxx.xxx.xxx 或 xxx.xxx.xxx.xxx (语法应适合 Linux 和 Solaris)
如何将以下命令合并到一个命令中?
echo $IP_ADDRESS | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
echo $IP_ADDRESS | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
我也尝试过这个(但没有用)
echo $IP_ADDRESS | egrep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}|[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
答案1
if expr ".$IP_ADDRESS" : '\(\.[0-9]\{1,3\}\)\{3,4\}$' > /dev/null
then echo match
else echo no match
fi
您不能grep
在此处使用,因为grep
用于匹配行,而不是字符串。您不能使用echo
其中任何一个,因为它会对其参数进行替换。您也不能将变量不加引号,否则会发生文件名生成和分词。
如果您想在输入文件中查找与该模式匹配的行,那么您需要在其中使用grep
.喜欢:
grep -Ex '[0-9]{1,3}(\.[0-9]{1.3}){2,3}' < input.file
-x
将报告完全由 3 或 4 个最多 3 位十进制数字组成(选项)的所有行。
如果您想在文本文件中提取所有 3 或 4 个最多 3 位十进制数字的 IP 地址,那么最好的选择可能是求助于perl
:
perl -lne 'print for grep /^\d{1,3}(\.\d{1,3}){2,3}$/, /[\d.]+/g'
会输出:
111.222.333
1.2.3.4
对于这样的输入:
foo 1.1234.2.3 1.2 1.2.3.4.5 111.222.333 bar1.2.3.4@
虽然你也可以这样做:
tr -cs 0-9. '[\n*]' < input.file |
grep -Ex '[0-9]{1,3}(\.[0-9]{1.3}){2,3}'
答案2
这应该可以做到:
echo $IP_ADDRESS | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'
或使用命名集:
echo $IP_ADDRESS | grep -Eo '([[:digit:]]{1,3}\.[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){1,2})'
例子
# 4 octets
$ echo '10.10.0.1' | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'
10.10.0.1
# 3 octets
$ echo '10.10.0' | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'
10.10.0
# 2 octets
$ echo '10.10' | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'
$
笔记:这些将匹配从 0.0.0.0 到 999.999.999.999 的所有表达式