带通配符的 grep

grep with wildcard symbols

使用 grep 进行通配符搜索

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

root@test:~/test# cat z
192.168.1.0
192.168.2.0
192.168.110.7
192.168.115.5

1. root@test:~/test# grep -o 192.1 z
192.1
192.1
192.1
192.1


2. root@test:~/test# grep -o 192.1* z
192.1
192.1
192.1
192.1

3. root@test:~/test# grep -o 192.1. z
192.16
192.16
192.16
192.16


4. root@test:~/test# grep -o 192.1.* z
192.168.1.0
192.168.2.0
192.168.110.7
192.168.115.5
  • 一个点(.)匹配任何字符,你必须转义它:\..

  • -o 仅显示匹配部分,如果您从末尾省略 .* (=任何字符),它将省略该行的其余部分(因为它不是匹配字符串的一部分)。

  • .* 可以匹配比您需要的更多的内容(它将匹配该行的其余部分),更愿意明确说明您允许的内容:[0-9.]*.

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

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

为什么你的命令不起作用:

1. root@test:~/test# grep -o 192.1 z

只匹配192<any char>1,因为-o开关,所以只打印匹配的部分。

2. root@test:~/test# grep -o 192.1* z

只会匹配192<any char>192<any char>1192<any char>11192<any char>111等,因为[=15=,所以只会打印匹配的部分] 转变。您的输入不包含任何不同的数据。

3. root@test:~/test# grep -o 192.1. z

只匹配192<any char>1<any char>,因为-o开关,所以只打印匹配的部分。这给你多了一个字符(. 代表 "any" 单个字符)。

4. root@test:~/test# grep -o 192.1.* z

任何以192<any char>1开头的行都将被匹配,并且因为-o开关,所以只打印匹配的部分。 .* 匹配直到行尾的所有内容,包括空字符串。

IP 地址的正则表达式

您可以在网上找到很多 IP 地址正则表达式,例如,请参阅此 Whosebug question。但是请注意,某些表达式仅用于匹配 IP 地址,因此包含行首 (^) 和行尾 ($) 字符。如果您的输入包含的不仅仅是地址,您将不得不删除它们。