linux + 将 IP 地址与 3 个八位位组或 4 个八位位组匹配

linux + 将 IP 地址与 3 个八位位组或 4 个八位位组匹配

如何在一条命令中将 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 的所有表达式

相关内容