Regex 仅限B类网络内的Grep IP地址
Regex 仅限B类网络内的Grep IP地址,regex,linux,grep,Regex,Linux,Grep,172.16.0.0/12是B类网络。我只想从这门课上grep IP 这是示例日志文件 [user@linux ~]$ cat ClassB.txt 172.16.0.0/12 is a Class B networks 172.16.0.0 – 172.31.255.255 Network: 172.16.0.0/12 HostMin: 172.16.0.1 HostMax: 172.31.255.254 Broadcast: 172.31.255.
172.16.0.0/12
是B类网络。我只想从这门课上grep IP
这是示例日志文件
[user@linux ~]$ cat ClassB.txt
172.16.0.0/12 is a Class B networks
172.16.0.0 – 172.31.255.255
Network: 172.16.0.0/12
HostMin: 172.16.0.1
HostMax: 172.31.255.254
Broadcast: 172.31.255.255
Out of range: 172.32.255.254
Out of range: 172.15.0.1
Out of range: 172.4.0.1
[user@linux ~]$
如果我使用egrep-n'172.[1-3][0-9]'ClassB.txt
,这也将grep172.32.255.254
,这超出了B类范围
[user@linux ~]$ egrep -n '172.[1-3][0-9]' ClassB.txt
1:172.16.0.0/12 is a Class B networks
2:172.16.0.0 – 172.31.255.255
3:Network: 172.16.0.0/12
4:HostMin: 172.16.0.1
5:HostMax: 172.31.255.254
6:Broadcast: 172.31.255.255
7:Class B: 172.19.0.1
8:Class B: 172.20.0.1
9:Out of range: 172.32.255.254
10:Out of range: 172.15.0.1
[user@linux ~]$
我应该怎么做才能只对从172.16.0.0
到172.31.255.255
所需输出
[user@linux ~]$ <grep/egrep command here> ClassB.txt
1:172.16.0.0/12 is a Class B networks
2:172.16.0.0 – 172.31.255.255
3:Network: 172.16.0.0/12
4:HostMin: 172.16.0.1
5:HostMax: 172.31.255.254
6:Broadcast: 172.31.255.255
7:Class B: 172.19.0.1
8:Class B: 172.20.0.1
[user@linux ~]$
[user@linux~]$ClassB.txt
1:172.16.0.0/12为B类网络
2:172.16.0.0 – 172.31.255.255
3:网络:172.16.0.0/12
4:HostMin:172.16.0.1
5:HostMax:172.31.255.254
6:广播:172.31.255.255
7:B类:172.19.0.1
8:B类:172.20.0.1
[user@linux ~]$
我要做的是
grep "172\.\(1[6-9]\|2[0-9]\|3[01]\)\.[0-9]\{1,3\}\.[0-9]\{1,3\}" ClassB.txt
但得到答案并不意味着得到解决方案,所以让我解释一下。使用双引号或单引号是一种选择,其细微差别在于转义。我倾向于使用double,但在本例中,单格式完全相同
grep '172\.\(1[6-9]\|2[0-9]\|3[01]\)\.[0-9]\{1,3\}\.[0-9]\{1,3\}' ClassB.txt
此正则表达式假定输入已验证(即您没有超出范围的ip地址)。比如说172.31.555.1。这简化了验证grep表达式的过程
grep "172\.\(1[6-9]\|2[0-9]\|3[01]\)\.\([0-9]\.\|[1]\{,1\}[0-9]\{2\}\.\|2[0-4][0-9]\.\|25[0-5]\.\)\([0-9]\|[1]\{,1\}[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)" ClassB.txt
编辑:我忘了我的解释
验证答案有3个子组
\(1[6-9]\|2[0-9]\|3[01]\)\.
\([0-9]\.\|[1]\{,1\}[0-9]\{2\}\.\|2[0-4][0-9]\.\|25[0-5]\.\)
\([0-9]\|[1]\{,1\}[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)
它们与ip地址的三个结尾部分有关,你可以用第三个替换第二个,然后用\。技术上是一样的,因为经常有很多正则表达式可以工作,但看起来完全不同。我通常会选择第一个更简单的,因为大多数输入都是经过验证的,如果不是,则需要验证正则表达式
例如,如果您只需要所有ip地址,则使用更简单的正则表达式
grep "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}" ClassB.txt
同样,这需要预先验证输入。
grep-E'\b172(\.(1[6-9]| 2[0-9]| 3[01])\.(25[0-5]| 2[0-4][0-9][0-9]|[01]?[0-9][0-9]。\(25[0-5]| 2[0-4][0-9]|[01]|[0-9]|[01]| b)文件
双引号和双引号的转义策略是什么意思。有些是相同的,但有些是不同的。一些必须在双引号场景中完成的转义,也可以在单引号场景中完成,但不是必需的。bash中的转义字符串是一种艺术形式。