Распечатать статистику текстового файла

Предполагая, что все системы работают с одним и тем же дистрибутивом, сгенерируйте RPM (при условии, что это формат пакета, который использует ваш дистрибутив) и разверните его. Это имеет множество преимуществ и практически не имеет недостатков.

  • Создание пакета в соответствии с процедурой вашего дистрибутива гарантирует, что все будет на своих местах - не только ядро, но и initramfs (если они используются), модули, сценарии обновления загрузчика, документация, информация об отладке и сборке модулей и т. Д.
  • Создание пакета позволяет отслеживать версии. Даже если машина вышла из строя или был заполнен диск во время развертывания обновления, вы можете узнать, что установлено сейчас.
  • Используя диспетчер пакетов, вы можете развернуть любое программное обеспечение, а не только ядро. Вам не нужно изобретать велосипед для каждого программного обеспечения, которое вы хотите развернуть.
  • Если в вашем дистрибутиве нет задокументированного способа создания собственных пакетов ядра, то необходимо внести предоплату. Но если это так, а я думаю, что большинство так и поступает, тогда первоначальные затраты не больше, чем сбор всех необходимых бит вручную.
4
20.12.2016, 12:07
4 ответа

С помощью чего-то вроде этого вы можете выделить доступные минуты:

root@debian:# awk -F" " '{print $2" "$3}' b.txt |cut -f1-2 -d: |uniq
01/01/2010 20:56
02/01/2010 01:39
02/01/2010 01:40
02/01/2010 20:56

Затем вы можете назначить массив с этими значениями

Исправленный код:

readarray -t stamps < <(awk -F" " '{print $2" "$3}' b.txt |cut -f1-2 -d: |uniq)
for stamp in "${stamps[@]}";do
ev=$(grep "$stamp" b.txt |wc -l)
echo "In $stamp found $ev events "
#if [ "$ev" -gt 60 ]; then
# do the stuff
#fi
done

Вывод:

In 01/01/2010 20:56 found 7 events 
In 02/01/2010 01:39 found 11 events 
In 02/01/2010 01:40 found 4 events 
In 02/01/2010 20:56 found 7 events 
1
27.01.2020, 20:49

Это не самое эффективное решение, но вы можете сначала подсчитать количество событий для каждой минуты, а затем выполнить поиск файла для каждой из этих минут, когда счетчик> = 60.

sort -k 2,3 your_log_file \
| uniq -c -s 8 -w 16 \
| while read count _ date time _; do
    [ "$count" -ge 60 ] && grep -F " $date ${time%:*}" your_log_file
done

Примечания:

  • в базовом примере выше я сначала отсортировал ваш файл в хронологическом порядке
  • первые две строки дадут вам количество событий в минуту, если это единственное информация, которая вас интересует.

Если ваш файл полон событий, велика вероятность, что вы в конечном итоге будете выполнять с ним многочисленные команды grep . Лучшим решением будет последовательное чтение файла журнала и запоминание строк за последнюю минуту. Когда вы дойдете до следующей минуты, распечатайте эти строки, если их количество больше 60. См. Ответ Стефана для такого решения.

2
27.01.2020, 20:49
awk '{ print $2 " " $3 }' < input \
| cut -c1-16                      \
| sort                            \
| uniq -c                         \
| awk '{ if ($1 > 60) print $2 }'

т.е. получить поля даты и времени, убрать секунды, отсортировать результат (NB: было бы лучше, если бы ваши даты были в формате ISO), найти количество каждой уникальной комбинации даты / времени, а затем распечатать их со счетчиком> 60

1
27.01.2020, 20:49

В идеале вам нужно попробовать обработать файл только один раз и сохранить в памяти как можно меньше. В awk вы можете:

awk -v n=60 '
  {
    t = $2 substr($3, 1, 5);
    if (t == last_t) {
      if (++lines > n)
        print
      else
        if (lines == n)
          print saved $0
        else
          saved = saved $0 RS
    } else {
      saved = $0 RS
      lines = 1
      last_t = t
    }
  }' < your-file

Несколько преимуществ такого подхода:

  • Он ориентирован на потоковую обработку. Ввод обрабатывается, как только он приходит, а вывод выдается как можно скорее (как только просматривается 60-я строка). Это делает возможным постобработку живого вывода (как в tail -fn +1 log_file ).
  • он выполняет только один вызов одной команды ( awk ), поэтому будет максимально эффективным. Противоположным крайним случаем было бы выполнение нескольких команд в цикле . Самая дорогостоящая вещь в сценариях оболочки - это, как правило, разветвление и выполнение команд. Оптимизация означает максимальное сокращение этого количества.
  • мы храним в памяти не более 60 строк, поэтому использование памяти будет ограничено (при условии, что размер самих строк ограничен).
  • Код awk можно сделать очень разборчивым и понятным. Теперь, если размер имеет значение, вы также можете сделать его короче и на одной строке, например

     awk '{t = $ 2substr ($ 3,1,5); if (t == l) {if (++ i> n) print; else if (i == n) print s $ 0; else s = s $ 0RS} else {s = $ 0RS; i = 1; l = t}} 'n = 60 файлов 
     
4
27.01.2020, 20:49

Теги

Похожие вопросы