Хвост, grep и считать экземпляры, найденные в одной команде?

Я отслеживаю вывод файлов и подбираю строки с определенными данными. Я не хочу выводить данные на экран, а вместо этого посчитать количество найденных экземпляров и отправить их на экран. Число экземпляров может быть прокручиваемым и увеличивающимся, или оно может перезаписать существующее и отображать его только по мере увеличения. Эта часть на самом деле не важна, мне просто нужно найти количество экземпляров.

Моя команда сейчас

tail -f logfile | grep "данные, которые я хочу"

Я пытался использовать grep -c и wc -l, но ничего не дало мне результатов, которые я получаю. Этот конкретный дистрибутив Linux не имеет PV и не сможет его получить. Есть ли способ, которым я могу сделать это?

2 ответа

Решение

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
Другие вопросы по тегам