grep с wc -l кеширует счет - PullRequest
0 голосов
/ 27 июня 2018

Я заметил, что при подсчете строк с использованием приведенной ниже команды показывается несколько раз кэшированных результатов, есть идеи, почему?

grep "xxx" "filename.log" | wc -l

Возвращает значение счетчика при первом запуске. При повторном запуске все равно возвращается то же значение счетчика, даже если в файле больше совпадающих значений.

в чем может быть причина.

PS - я использую Ubuntu 16.04 LTS

Обновление - grep -c "xxx" filename.log возвращает правильный счет. Все еще задаюсь вопросом, почему команда выше не дает обновленного результата.

Как обеспечить постоянную запись буферов в файл?

К вашему сведению - я проверяю это в файле журнала доступа nginx, который постоянно обновляется с помощью вызовов запросов, со средней скоростью записи 10 lines/sec.

1 Ответ

0 голосов
/ 27 июня 2018

Если ваши новые xxx вхождения совпадают со старыми, это нормально, потому что grep выводит целые строки по умолчанию. Вы можете использовать grep -o для вывода отдельных совпадений в отдельных строках. Кстати, для подсчета можно использовать grep -c (или grep -o -c) (что быстрее, поскольку требует меньше записи).

Однако, если вы не видите новых строк в вашем файле после того, как думаете, что они записаны (что можно постоянно проверять с помощью tail -f или less: нажмите F, чтобы прочитать новые данные, и Ctrl-C прекратить чтение), вероятная причина - буферизация. (Что касается вашего комментария к 24 часам: обратите внимание, что буферы не сбрасываются просто со временем, а только переполняются или явно сбрасываются.) Вы можете попытаться вызвать stdbuf -o0 program ... вместо program ....

...