Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 带通配符的grep_Bash_Grep_Wildcard - Fatal编程技术网

Bash 带通配符的grep

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

使用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
    仅显示匹配的部分,如果从结尾处ommit
    *
    (=任何字符),它将ommit行的其余部分(因为它不是匹配字符串的一部分)

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

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


  • 您可能只想搜索单词(
    -w
    )。如果要确保只匹配IP地址,而不是类似的地址(没有连续的点,正好是4位数字,为什么命令(不)工作:

    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*
    表示
    零次或多次”1“characters
    。但是,我刚刚注意到我的答案与“zero”部分不完全一致,我对其进行了编辑。有关
    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