Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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 仅限B类网络内的Grep IP地址_Regex_Linux_Grep - Fatal编程技术网

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
,这也将grep
172.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中的转义字符串是一种艺术形式。