Bash 带通配符的grep
使用grep进行通配符搜索 我有一个包含许多IP地址的文件。我想列出文件中的所有ip地址,我使用了模式为192.16*的grep,但它没有显示整个ip地址列表。我只能列出整个IP地址,而使用句号后跟星号符号。所以我的疑问是,为什么第二种选择不起作用,但第三种选择效果很好Bash 带通配符的grep,bash,grep,wildcard,Bash,Grep,Wildcard,使用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
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
- 点(
)匹配任何字符,您必须将其转义:\。
仅显示匹配的部分,如果从结尾处ommit-o
(=任何字符),它将ommit行的其余部分(因为它不是匹配字符串的一部分)*
可以比您需要的匹配更多(它将匹配行的其余部分),更愿意明确地说出您允许的内容:*
[0-9.]*
- 确保将搜索表达式放在单引号中
,否则shell将解释特殊字符,并用匹配的文件名替换表达式(幸运的是,您没有任何匹配的文件名)'192.168\.[0-9.]*'
- 您可能只想搜索单词(
)。如果要确保只匹配IP地址,而不是类似的地址(没有连续的点,正好是4位数字,为什么命令(不)工作:-w
1. root@test:~/test# grep -o 192.1 z
仅192。但是请注意,某些表达式仅用于匹配IP地址,因此包含开头(
)和行尾(^
)字符。如果您的输入包含的不仅仅是地址,您将不得不删除这些字符。我想您需要$
谢谢您的详细解释,但我仍然对第二个字符感到困惑,您说:grep 192\.1 z
但为什么不能:“只有1921、19211、192111等将被匹配”
据我所知,“仅1921、19216、192168等。”
表示任何包含192.168区域中所有IP地址的内容。in(两者)正则表达式,*
是一个量词。这意味着它表示前一个字符必须出现在输入中以匹配模式的频率。*
表示*
。因此在示例2中,零次或多次
表示1*
。但是,我刚刚注意到我的答案与“zero”部分不完全一致,我对其进行了编辑。有关零次或多次”1“characters
使用的正则表达式的更多信息,请参见手册grep
。感谢您的详细说明。现在我已经明白了:)regex(7)
2. root@test:~/test# grep -o 192.1* z
3. root@test:~/test# grep -o 192.1. z
4. root@test:~/test# grep -o 192.1.* z