带通配符的 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>1
、192<any char>11
、192<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 地址,因此包含行首 (^
) 和行尾 ($
) 字符。如果您的输入包含的不仅仅是地址,您将不得不删除它们。
使用 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>1
、192<any char>11
、192<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 地址,因此包含行首 (^
) 和行尾 ($
) 字符。如果您的输入包含的不仅仅是地址,您将不得不删除它们。