Я отслеживаю вывод файлов и ищу строки с определенными данными. Я не хочу выводить данные на экран, а вместо этого подсчитываю количество найденных экземпляров и отправляю их на экран. Количество экземпляров может прокручиваться и увеличиваться, или оно может перезаписывать существующие и показывать его только по мере увеличения. Эта часть на самом деле не важна, мне просто нужно текущее количество найденных экземпляров.
Моя команда прямо сейчас
tail -f файл журнала | grep 'данные, которые я хочу'
Я пробовал использовать grep -c и wc -l, но ничего не дало мне результатов, которые мне нужны. В этом конкретном дистрибутиве Linux нет pv, и он не сможет его получить. Как я могу это сделать?
GNU awk может сделать это довольно легко.
Прокатный выход:
tail -f logfile | grep 'stuff to grep for' | awk '{++i;print i}'
Вы также можете не использовать grep и использовать вместо него регулярные выражения awk:
tail -f logfile | awk '/stuff to grep for/ {++i;print i}'
Для однострочного вывода вы можете добавить CR, чтобы он снова начинался в начале строки (работает на консоли):
tail -f logfile | awk '/stuff to grep for/ {++i;printf "\r%d",i}'
Всегда есть верный watch
вариант:
watch -d grep -c "string" /path/to/file
что от идеала, когда размер вашего файла превышает пару 100 МБ.
Спасибо за предложение @ sa289 использовать промежуточный файл:
tail -f /path/to/file |grep "string" > /tmp/intermediate-file &
watch -d grep -c "string" /tmp/intermediate-file