![无法使用 grep 正则表达式搜索包含句点的文件名](https://linux22.com/image/669549/%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8%20grep%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%90%9C%E7%B4%A2%E5%8C%85%E5%90%AB%E5%8F%A5%E7%82%B9%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D.png)
Ubuntu 14.x. 使用 grep 搜索所有文件linux测试-客户端2。这包括多个文件扩展名(csr、crt、key)。当我 grep 文件名的中间部分“2.”时,使用 ls -l 时,除了“2.”之外,它还会返回包含“2”的行。这会导致返回的文件大小、日期和时间中都有“2”的结果。
为什么文件大小会由此 grep 触发,而文件后面没有句点?:
root@ip-10-198-0-205:/etc/easy-rsa# ls -ltr keys/ | grep -E '*2.*'
total 228
-rw------- 1 root root 3272 Oct 15 18:28 ca.key
-rw-r--r-- 1 root root 2451 Oct 15 18:28 ca.crt
-rw------- 1 root root 3268 Oct 15 18:31 server.key
-rw-r--r-- 1 root root 769 Oct 15 18:42 dh4096.pem
-rw-r--r-- 1 root root 8244 Oct 19 15:36 02.pem
-rw-r--r-- 1 root root 8250 Oct 19 19:21 03.pem
-rw------- 1 root root 3394 Oct 23 19:48 removemetest.key
-rw-r--r-- 1 root root 1785 Oct 23 19:48 removemetest.csr
-rw-r--r-- 1 root root 8264 Oct 23 19:48 removemetest.crt
-rw-r--r-- 1 root root 8264 Oct 23 19:48 04.pem
-rw------- 1 root root 3394 Oct 23 20:50 revoketest449.key
-rw-r--r-- 1 root root 1789 Oct 23 20:50 revoketest449.csr
-rw-r--r-- 1 root root 8270 Oct 23 20:50 revoketest449.crt
-rw-r--r-- 1 root root 8270 Oct 23 20:50 05.pem
-rw-r--r-- 1 root root 3633 Oct 23 20:50 revoke-test.pem
-rw-r--r-- 1 root root 1182 Oct 23 20:50 crl.pem
-rw------- 1 root root 3394 Oct 23 20:54 linuxtest-client1.key
-rw-r--r-- 1 root root 1793 Oct 23 20:54 linuxtest-client1.csr
-rw-r--r-- 1 root root 3 Oct 23 20:54 serial.old
-rw-r--r-- 1 root root 8287 Oct 23 20:54 linuxtest-client1.crt
-rw-r--r-- 1 root root 909 Oct 23 20:54 index.txt.old
-rw-r--r-- 1 root root 21 Oct 23 20:54 index.txt.attr.old
-rw-r--r-- 1 root root 8287 Oct 23 20:54 06.pem
-rw------- 1 root root 3394 Oct 26 17:57 linuxtest-client2.key
-rw-r--r-- 1 root root 1793 Oct 26 17:57 linuxtest-client2.csr
-rw-r--r-- 1 root root 3 Oct 26 17:57 serial
-rw-r--r-- 1 root root 8287 Oct 26 17:57 linuxtest-client2.crt
-rw-r--r-- 1 root root 21 Oct 26 17:57 index.txt.attr
-rw-r--r-- 1 root root 1058 Oct 26 17:57 index.txt
-rw-r--r-- 1 root root 8287 Oct 26 17:57 07.pem
但是如果我不在 ls 上使用 -l,那么它会返回我想要的正确结果,所以显然我的正则表达式是正确的:
root@ip-10-198-0-205:/etc/easy-rsa# ls keys/ | grep -E '*2.*'
02.pem
linuxtest-client2.crt
linuxtest-client2.csr
linuxtest-client2.key
答案1
Grep 默认将模式视为基本正则表达式,这意味着.
将匹配任何单个字符。您可以转义.
以使其表示文字句点。
ls -l | grep "2\."
会给你你想要的东西,或者你可以告诉grep
它只搜索固定字符串,而不是正则表达式,比如
ls -l | grep -F "2."
由于您为 grep 提供了-E
标志,因此它实际上会尝试使用扩展正则表达式,但您似乎使用了 shell 通配符,而这些通配符在正则表达式中的作用并不相同。正则*
表达式中的 表示 0 个或更多前一个组或字符,而.
表示任何字符,因此正则.*
表达式中的 表示 0 个或更多任何字符。因此grep -E "*2.*"
实际上与 相同,grep 2
这就是为什么它在ls -l
版本中匹配如此多额外的东西
当然,你也可以让 shell 使用通配符来处理
ls -l *2.*