2015-05-03 52 views
2

grep的通配符搜索使用通配符符号的grep

我有一个包含许多IP地址的文件。我想列出文件中的所有IP地址,并使用格式192.16 *的grep,但它不显示整个IP地址列表。我只能列出整个IP地址,而使用周期后跟星号符号。所以我的疑问是为什么第二选项不工作,但第三选项正常工作。

[email protected]:~/test# cat z 
192.168.1.0 
192.168.2.0 
192.168.110.7 
192.168.115.5 

1. [email protected]:~/test# grep -o 192.1 z 
192.1 
192.1 
192.1 
192.1 


2. [email protected]:~/test# grep -o 192.1* z 
192.1 
192.1 
192.1 
192.1 

3. [email protected]:~/test# grep -o 192.1. z 
192.16 
192.16 
192.16 
192.16 


4. [email protected]:~/test# grep -o 192.1.* z 
192.168.1.0 
192.168.2.0 
192.168.110.7 
192.168.115.5 
+2

我想你想的grep'192 \ .1 z' – Jahid

回答

3

为什么你的命令(不)工作:

1. [email protected]:~/test# grep -o 192.1 z 

只有192<any char>1将被匹配,只有匹配的部分会因为-o交换机上进行印刷。

2. [email protected]:~/test# grep -o 192.1* z 

只有192<any char>192<any char>1192<any char>11192<any char>111等将被匹配,并且由于-o开关的唯一匹配的部分将被打印。您的输入不包含数据,这有什么不同。

3. [email protected]:~/test# grep -o 192.1. z 

只有192<any char>1<any char>将被匹配,并且由于-o开关的唯一匹配的部分将被打印。这给你多一个字符(.代表“任何”单个字符)。

4. [email protected]:~/test# grep -o 192.1.* z 

任意以192<any char>1线将被匹配,并且由于-o开关的唯一匹配的部分将被打印。 .*匹配直到行尾的所有内容,包括空字符串。

定期对IP地址的表达

你可以找到很多IP地址的正则表达式的网站上,看到了这个例子StackOverflow question。但请注意,某些表达式仅用于匹配IP地址,因此包含开始字符(^)和行尾($)字符。如果您的输入不仅包含地址,您将不得不删除这些内容。

+0

感谢您的详细解释,但我还是有疑惑的第二个,你说: '“只有192 1,192 11,192 111等将匹配 “' 但为什么它不能是: '” 只有192 1,192 16,192 168等。“'据我所知,'*'意味着任何东西,包括所有也是192.168地区的IP地址。 – theG

+0

在(“基本”和“扩展”](http://www.gnu.org/software/grep/manual/html_node/Basic-vs-Extended.html))正则表达式中,'*'是一个量词。这意味着它表示,前面的字符必须出现在输入中以匹配模式。 '*'代表'零次或多次'。所以在例2中,'1 *'意味着零个或多个“1”字符。不过,我刚刚注意到,我的回答并不完全是关于“零”部分,我编辑过。有关'grep'使用的正则表达式的更多信息,请参阅manpage'regex(7)'。 –

+1

谢谢你的阐述。我现在很清楚:) – theG

2
  • 一个点(.)匹配任何性格,你要逃避它:\.

  • -o只显示匹配的部分,如果你ommit .*的端部(=任何字符),它将ommit该行的其余部分(因为它不匹配字符串的一部分)。

  • .*可以比你需要的匹配得多(它会匹配其余的线),更愿意明确地说明你允许的:[0-9.]*

  • 确保你把单引号'192.168\.[0-9.]*'搜索表达式,否则shell将解释的特殊字符,与匹配的文件名(幸运的是你没有任何匹配的文件名)替代表达。

  • 您可能只想搜索单词(-w)。如果你想确保你只匹配IP地址,而不是像它那样(没有连续的点,正好4位数,< = 255 ...),那么你需要更复杂的表达式。