Задать вопрос
@MatchPlayer77

Grep не находит строку, которая точно есть в файле, что делать?

Разбирал живую проблему на проде сайта aipredict.one (страница матча зависла со старыми данными) и наткнулся на побочную странность.

На сервере (Ubuntu, GNU grep) искал число в JSON-файле с архивом матчей сайта:

deploy@aipredict:~/aipredict.one$ grep -l '1627588' data/archive/2026-08.json
$


Пусто. Файл существует, права на чтение есть, опечаток в числе нет - проверял несколько раз.

Тут же, для той же самой строки того же самого файла:

$data = json_decode(file_get_contents('data/archive/2026-08.json'), true);
foreach ($data as $rec) {
    if ((string)$rec['fixtureId'] === '1627588') {
        print_r($rec); // находит без проблем
    }
}


PHP находит запись сразу. Файл при этом один и тот же, между командами не менялся.

Вопрос: почему grep мог не найти подстроку, которая физически есть в файле и успешно вычитывается другим инструментом? Дайте хотя бы 2-3 гипотезы, объясняющие такое поведение, и как проверить каждую.
  • Вопрос задан
  • 484 просмотра
Подписаться 3 Простой 11 комментариев
Помогут разобраться в теме Все курсы
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • Нетология
    1С-программист: базовый курс
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия DevOps-инженер + ИИ
    5 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А точно grep ничего не выводит? Вы просите его вывести только имя файла, в котором есть нужная строка (ключ -l). Предполагаю, что имя то выводится.
А вообще для работы с JSON в линуксе есть команда jq.
Аналог вашего PHP-кода:
jq '.[] | select(.fixtureId == "1627588")' data/archive/2026-08.json
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
О! Был у меня такой кейс!

Вероятно GREP обнаруживает в файле не-ASCII символ (0xFF например), и из-за этого (ошибочно?) считает файл бинарным, и по какой-то логике не находит требуемый текст.

Укажите GREP-у аргумент --text, может сработать.
Ответ написан
Комментировать
@Zerg89
Файла с путем data/archive/2026-08.json несуществует, путь должен быть либо полным от корня /data/archive/2026-08.json либо относительным каталога в котором вы находитесь ./data/archive/2026-08.json
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы