Сценарий оболочки только для подсчета последовательных дней

Мне было интересно, как я буду ходить, чтобы сделать это.

Это пример моего вывода

Sun Aug 21 2016 03:00:00, BLAH Mon Aug 22 2016 03:54:00, BLAH Tue Aug 23 2016 04:22:11, BLAH Thu Aug 25 2016 05:00:00, BLAH 

Теперь то, что я хотел бы сделать, это только подсчет последовательных дней, поэтому в приведенном выше примере он должен сказать, что BLAH появился 3 раза, поскольку они находятся друг за другом.

У меня есть bash, awk и sed.

2 Solutions collect form web for “Сценарий оболочки только для подсчета последовательных дней”

В AWK:

 { sub(",", "", $0); # kill first comma, thanks Thomas cmd="date -d \""$1" "$2" "$3" "$4" "$5" 1 day ago\" \"+%b %e\""; cmd|getline dt; close(cmd); if (dt==prev && blah==substr($0, index($0, $6))) { times = times + 1 } else { print times" "line; times = 1 }; prev=$2" "$3; blah=substr($0, index($0,$6)); line=$0; } END { print times" "line } 

Предполагая, что у нас есть этот вход внутри файла с именем blah.log :

 Sun Aug 21 2016 03:00:00, BLAH Mon Aug 22 2016 03:54:00, BLAH Tue Aug 23 2016 04:22:11, BLAH Thu Aug 25 2016 05:00:00, BLAH 

И скрипт awk в файле consecutive.awk , мы можем сделать:

 $ awk -f consecutive.awk blah.log 3 Tue Aug 23 2016 04:22:11 BLAH 1 Thu Aug 25 2016 05:00:00 BLAH 

Который дает количество последовательных дней в качестве дополнительного столбца и печатает последнюю дату. Чтобы избавиться от даты на выходе, вы можете просто изменить print times" "line чтобы print times" "blah (в двух появляющихся местах).

Как это работает:

  • Выполняет команду даты, чтобы получить вчерашнюю строку, спасибо glenn jackman
  • Сравнивает с сохраненной датой из предыдущей строки
  • Увеличивает счетчик или распечатывает
  • Сохраняет данные из текущей строки для следующего запуска

Заметки:

  • Это безобразно (все AWK-код, преодолевать его)
  • Хорошо работает во всех пробелах (до целого года), потому что он использует date , но игнорирует временные интервалы
  • Он считает, что BLAH может отличаться на разных строках и соответствует только BLAH-событиям против других случаев BLAH. Если файл не упорядочен, вам может потребоваться выполнить sort -t , -k 2 .
  • Если вам нужно учитывать разные значения BLAH, вам нужен GNU awk (благодаря вызову substr ). В противном случае вы можете убить вызов substr и скрипт будет запущен на любом awix posix.

Это заняло больше, чем я думал, но сценарий ниже выполнит эту работу.

 #!/bin/bash str=" Sun Aug 21 2016 03:00:00, BLAH Mon Aug 22 2016 03:54:00, BLAH" str+=" Tue Aug 23 2016 04:22:11, BLAH Thu Aug 25 2016 05:00:00, BLAH" IFS='H' read -r -a inputArray <<< "$str" days=(SunMon MonTue TueWed WedThu ThuFri FriSat SatSun) count=1 found=0 lastOne="" finalCount=0 for entry in "${inputArray[@]}"; do thisOne="${entry:1:3}" test="$lastOne$thisOne" for pair in "${days[@]}"; do if [ "$test" == "$pair" ]; then ((++count, ++found)) fi done if [ ! $found ]; then count=1; else found=0; fi if [ $count -gt $finalCount ]; then finalCount=$count fi lastOne=$thisOne done echo "There were $finalCount BLAHs in a row." 
  • Объединение двух частей вместе для создания единого сценария
  • Запуск локального скрипта с локальным файлом ввода на удаленном хосте
  • Параметры переменных окружения из файла
  • я хочу напечатать строку, которая начинается с словесного слова, а в остальных записях печатается только одно поле
  • изменить шаблон, удалив пробелы?
  • Как правильно запустить программу и сделать возможным перенаправить свой текущий выход (stdout и stderr) на более поздний этап?
  • Как ssh в удаленном ящике, запустите команду и продолжайте ее работу после отключения
  • Распечатать номера от 1 до 50
  • Как удалить папки, созданные с именами дат 2016-04-03 до 2016-10-4
  • Как передать путь файла к функции вместо содержимого файла?
  • Как удалить текст в файле до и после некоторого шаблона
  • Linux и Unix - лучшая ОС в мире.