Вопрос или проблема
Почему я могу найти некоторые результаты с помощью find -exec grep
, но когда я хочу выполнить поиск в самом файле, grep
ничего не возвращает?
[me@host logs]$ find . -iregex .*271.*.log.2024.09.26.* -exec grep "WstxIOException" {} +
./fuse_app-271-2k2xn.log.2024.09.26.31:Caused by: com.ctc.wstx.exc.WstxIOException: null
./fuse_app-271-2k2xn.log.2024.09.26.31:Caused by: com.ctc.wstx.exc.WstxIOException: null
./fuse_app-271-c4fjw.log.2024.09.26.31:Caused by: com.ctc.wstx.exc.WstxIOException: null
./fuse_app-271-c4fjw.log.2024.09.26.32:Caused by: com.ctc.wstx.exc.WstxIOException: null
./fuse_app-271-2k2xn.log.2024.09.26.32:Caused by: com.ctc.wstx.exc.WstxIOException: null
./fuse_app-271-2k2xn.log.2024.09.26.32:Caused by: com.ctc.wstx.exc.WstxIOException: null
[me@host logs]$ ll ./fuse_app-271-2k2xn.log.2024.09.26.31
-rw-r--r--. 1 11200 11200 209717550 Sep 26 09:24 ./fuse_app-271-2k2xn.log.2024.09.26.31
[me@host logs]$ grep "Caused by: com.ctc.wstx.exc.WstxIOException: null" ./fuse_app-271-2k2xn.log.2024.09.26.31
[me@host logs]$
Версия: grep (GNU grep) 2.20
Вы не сравниваете одно и то же:
- Ваша команда
find
(в которой вы всегда должны заключать шаблоны и регулярные выражения в кавычки) ищетWstxIOException
- Ваш прямой
grep
ищетCaused by: com.ctc.wstx.exc.WstxIOException: null
Вы увидите, что если вы используете одну и ту же строку для сопоставления шаблона в обеих ситуациях, вы получите одинаковый результат,
find . -iregex '.*271.*.log.2024.09.26.*' -exec grep 'WstxIOException' {} +
grep 'WstxIOException' ./*271*.log.2024.09.26*
Подразумеваемый вопрос: почему вы не можете сопоставить с большим шаблоном, который визуально выглядит как Caused by: com.ctc.wstx.exc.WstxIOException: null
. Я бы предложил, что это связано с тем, что один или несколько символов не такие, как вы ожидаете (например, табуляция вместо пробела), или в файле есть невидимые (непечатаемые) символы.
Ответ или решение
Ваш вопрос о том, почему команда find -exec grep
находит результаты, тогда как прямая команда grep
возвращает ничего, может быть объяснён несколькими причинам.
-
Сравнение поисковых строк: Вы используете разные строки поиска в командах. В первом случае вы ищете строку
WstxIOException
, тогда как во втором случае вы пытаетесь найти строкуCaused by: com.ctc.wstx.exc.WstxIOException: null
. Таким образом, не нужно удивляться, что результаты поиска различаются. Рекомендуется использовать одинаковую строку для поиска в обоих случаях.Пример корректного поиска будет выглядеть следующим образом:
find . -iregex '.*271.*.log.2024.09.26.*' -exec grep 'Caused by: com.ctc.wstx.exc.WstxIOException: null' {} + grep 'Caused by: com.ctc.wstx.exc.WstxIOException: null' ./*271*.log.2024.09.26*
-
Невидимые символы: Если вы используете идентичные строки, но всё равно получаете разные результаты, то возможно, что в файле присутствуют невидимые (непечатаемые) символы или пробелы, которые не видны при визуальном осмотре. Чтобы выявить такие символы, вы можете использовать следующие команды:
cat -A ./fuse_app-271-2k2xn.log.2024.09.26.31 | less
Эта команда покажет символы конца строки, пробелы и другие невидимые символы.
-
Кодировка файла: Убедитесь, что файл, который вы ищете, имеет правильную кодировку.
grep
может не находить результаты, если файл сохранён в кодировке, отличной от ожидаемой. Проверьте кодировку файла с помощью команды:file -i ./fuse_app-271-2k2xn.log.2024.09.26.31
-
Флаги команд: Обратите внимание на флаги, которые вы используете с
grep
. Например, добавление флага-i
позволит игнорировать регистр (чувствительность к регистру) при поиске, что может помочь, если не уверены в регистрах символов.
Если проверить все эти моменты и использовать аналогичные строки для поиска в обеих командах, проблема должна быть решена. Надеюсь, это поможет вам разобраться в ситуации.