【问题标题】:grep with wildcard symbols带有通配符的 grep
【发布时间】:2015-05-03 10:25:38
【问题描述】:

使用 grep 进行通配符搜索

我有一个包含许多 IP 地址的文件。我想列出文件中的所有 IP 地址,并使用 grep 模式 192.16* 但它没有显示整个 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

【问题讨论】:

  • 我想你想要grep 192\.1 z

标签: bash grep wildcard


【解决方案1】:
  • 点 (.) 匹配 任何 字符,您必须对其进行转义:\.

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

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

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

  • 您可能只想搜索单词 (-w)。如果你想确保你只匹配 IP 地址而不是类似的东西(没有连续的点,正好 4 位,

【讨论】:

    【解决方案2】:

    为什么您的命令(不起作用):

    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等,并且由于-o开关,只会打印匹配的部分。您的输入不包含有任何影响的数据。

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

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

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

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

    IP 地址的正则表达式

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

    【讨论】:

    • 谢谢你的详细解释,但我仍然对第二个感到困惑,你说:"Only 192<any char>1, 192<any char>11, 192<any char>111 etc. will be matched" 但为什么不能:"Only 192<any char>1, 192<any char>16, 192<any char>168 etc." 据我所知,* 意味着什么也包括 192.168 区域中的所有 IP 地址。
    • 在("basic" and "extended")正则表达式中,* 是一个量词。这意味着它表示,多久前一个字符必须出现在输入中以匹配模式。 * 代表 zero or more times。所以在示例 2 中,1* 表示 zero or more "1" characters。但是,我刚刚注意到我的答案对于“零”部分并不准确,我已经对其进行了编辑。有关grep 使用的正则表达式的更多信息,请参见手册页regex(7)
    • 感谢您的详细说明。我现在很清楚:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多