Сохранять счет из файла журнала

У меня есть файл с именем output.log который имеет этот контент:

 Thread started Thread finished Thread started Thread finished Thread started Thread started 

Я контролирую его вывод, используя:

 tail -f output.log 

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

 2 threads are running 

Должен ли я, возможно, использовать grep и каким-то образом поддерживать подсчет строк?

  • Временно заморозить процесс при взаимодействии оболочки
  • Подавлять сообщения об усечении файла при использовании хвоста
  • Как активно grep log за последние 15 секунд для фразы?
  • Трубопровод от grep до awk не работает
  • Перенаправить выход хвоста в файл, а затем остановить, когда найдено совпадение
  • Периодически получать новые строки из файла, возможно, зависания
  • Можно ли «перевернуть» символическую ссылку на новый файл, не затрагивая никаких открытых дескрипторов файлов?
  • выход tailf как параметр скрипта
  • 3 Solutions collect form web for “Сохранять счет из файла журнала”

    Вы можете использовать awk для подсчета. Хотя, если ничего более сложного, вы можете использовать

     tail -f output.log | awk '/Thread started/{n++}/Thread finished/{n--} END { printf ("%d Threads are running\n", n)}' output.log 

    Еще лучше, используйте следующие watch :

     watch -n.2 -x awk '/Thread started/{n++}/Thread finished/{n--} END { printf ("%d Threads are running\n", n)}' output.log 

    В -n.2 будут обновляться каждые 0.2s которые появятся в верхней части экрана.

    Вы можете попробовать следующий сценарий bash :

     #!/bin/bash start_count=$(grep -c "started" /path/to/output.log) finish_count=$(grep -c "finished" /path/to/output.log) echo "$((start_count - finish_count)) threads are running" 

    Это рассматривает любые ранее запущенные потоки, выходящие за пределы области печати tail -f . Здесь мы подсчитали появления «start» и «finished» в файле, а затем просто вычтем значения, чтобы получить результат. Если вы хотите, чтобы вы выбирали любой диапазон строк (например, tail -30 /path/to/output.log ), чтобы читать, а не весь файл, а затем находить результат с учетом этих строк.

    Попробуйте запустить этот скрипт,

     a=$(grep started output.log | wc -l) b=$(grep finished output.log | wc -l) echo Total Running threads: "$[$a-$b]" 

    Создайте скрипт bash и вставьте в него указанные выше строки. Вы получите текущие потоки.

    Linux и Unix - лучшая ОС в мире.