Regex
無法使用 grep 正則表達式搜尋包含句點的文件名
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.*