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

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

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

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.

  • sed regex для группы захвата между разделителями
  • Bash: date -d выбрасывает «недопустимую дату», когда дата параметризуется
  • Как остановить фоновый процесс, запущенный в том же скрипте, без выхода из сценария?
  • Как избежать повторения команд sed при добавлении сайтов в лак?
  • Как настроить mailx для поддержки Gmail?
  • Перенаправление stdout игнорирует строки без символа перевода строки
  • Фильтры поиска LDAP с использованием BASH
  • Поиск и удаление с регулярным выражением
  • 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." 
    Linux и Unix - лучшая ОС в мире.