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

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

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

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

  • grep для слов не более определенной длины
  • Количество строк в строке
  • Возвращайте только часть строки после соответствующего шаблона
  • С grep, как я могу сопоставить шаблон и инвертировать совпадение с другим шаблоном?
  • Извлечение совпадающих слов с помощью grep на Cygwin
  • find / grep выводит две строки для каждого найденного файла
  •  tail -f output.log 

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

     2 threads are running 

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

  • Что делает grep, когда он не запускает CPU?
  • make awk напечатать строку, соответствующую переменной и следующим n строкам, и использовать переменную в awk
  • Как в режиме реального времени выводить вывод, содержащий индикатор выполнения?
  • Как искать одиночные кавычки и двойные кавычки в поиске grep?
  • Как отсортировать имена файлов, показанные в команде grep, на основе метки времени?
  • Результаты кошки grep
  • 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 - лучшая ОС в мире.