Назад | Перейти на главную страницу

Невозможно использовать регулярное выражение 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

Но если я не использую -l в ls, тогда он возвращает правильные результаты, которые я ищу, поэтому очевидно, что мое регулярное выражение верное:

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 flag, он на самом деле попытается использовать расширенное регулярное выражение, но тогда вы, похоже, используете подстановочные знаки оболочки, которые не означают, что они делают в регулярном выражении. В * в регулярном выражении означает 0 или более предыдущей группы или символа, и . означает любой персонаж так .* в регулярном выражении означает 0 или более любого символа. Так grep -E "*2.*" действительно то же самое, что grep 2 вот почему он совмещает так много дополнительных вещей в ls -l версия

Конечно, вы можете просто позволить оболочке обрабатывать это за вас с помощью подстановочных знаков

ls -l *2.*