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

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

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

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

 tail -f output.log 

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

 2 threads are running 

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

  • Подавлять сообщения об усечении файла при использовании хвоста
  • Трубопровод от grep до awk не работает
  • Временно заморозить процесс при взаимодействии оболочки
  • Греп от конца файла до начала
  • Tail Grep - печать окружающих линий до тех пор, пока шаблон не будет сопоставлен
  • Файлы с изменением хвоста
  • Почему комбинация tail + grep + cut не работает?
  • Как эхо из определенной строки файла в другую определенную строку
  • 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 - лучшая ОС в мире.