Regex

無法使用 grep 正則表達式搜尋包含句點的文件名

  • October 26, 2015

Ubuntu 14.x。使用 grep 搜尋所有文件linuxtest-client2。這包括多個文件副檔名(csr、crt、key)。當我 grep 查找文件名的中間部分“2.”時,它還會返回除“2”之外還包含“2”的行。使用 ls -l 時。這會導致返回的結果在文件大小、日期和時間中具有“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

Grep 預設將模式視為基本正則表達式,這意味著.將匹配任何單個字元。您可以直接轉義.以使其表示字面句點。

ls -l | grep "2\."

會給你你正在尋找的東西,或者你可以告訴你grep只搜尋固定字元串,而不是正則表達式,比如

ls -l | grep -F "2."

既然你給了 grep-E標誌,它實際上會嘗試使用擴展的正則表達式,但是你似乎正在使用 shell 萬用字元,這並不意味著它們在正則表達式中的作用。*in regex 表示前一個組或字元的 0 個或多個,並且表示.任何字元,因此.*在 regex 中表示任何字元的 0 個或多個。所以grep -E "*2.*"真的是一樣的,grep 2這就是為什麼它在ls -l版本中匹配了這麼多額外的東西

當然,你可以讓 shell 用萬用字元為你處理它

ls -l *2.*

引用自:https://serverfault.com/questions/731759