find -exec grep может найти результаты, в то время как grep напрямую в файле ничего не возвращает

Вопрос или проблема

Почему я могу найти некоторые результаты с помощью 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 возвращает ничего, может быть объяснён несколькими причинам.

  1. Сравнение поисковых строк: Вы используете разные строки поиска в командах. В первом случае вы ищете строку 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*
  2. Невидимые символы: Если вы используете идентичные строки, но всё равно получаете разные результаты, то возможно, что в файле присутствуют невидимые (непечатаемые) символы или пробелы, которые не видны при визуальном осмотре. Чтобы выявить такие символы, вы можете использовать следующие команды:

    cat -A ./fuse_app-271-2k2xn.log.2024.09.26.31 | less

    Эта команда покажет символы конца строки, пробелы и другие невидимые символы.

  3. Кодировка файла: Убедитесь, что файл, который вы ищете, имеет правильную кодировку. grep может не находить результаты, если файл сохранён в кодировке, отличной от ожидаемой. Проверьте кодировку файла с помощью команды:

    file -i ./fuse_app-271-2k2xn.log.2024.09.26.31
  4. Флаги команд: Обратите внимание на флаги, которые вы используете с grep. Например, добавление флага -i позволит игнорировать регистр (чувствительность к регистру) при поиске, что может помочь, если не уверены в регистрах символов.

Если проверить все эти моменты и использовать аналогичные строки для поиска в обеих командах, проблема должна быть решена. Надеюсь, это поможет вам разобраться в ситуации.

Оцените материал
Добавить комментарий

Капча загружается...