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

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

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

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." 
  • Как использовать аргументы командной строки в сценарии оболочки
  • crontab не выполняет мой скрипт?
  • Как bash различает расширение брекетов и группировку команд?
  • Как узнать, печатает ли программа на stderr или stdout в терминале?
  • вытягивание строк из смешанного файла строк и двоичных
  • Как кот командный файл?
  • удаление данных из txt-файла
  • Как избежать пробелов и т. Д. В переданной переменной, для системного вызова cp в awk
  • Несколько shebangs в одном файле bash
  • Как создать скрипт, который не может быть легко удален
  • возвращаемое значение команды, не отображаемой в скрипте
  • Удалить последний символ строки, используя строковое манипулирование в сценарии оболочки
  • Linux и Unix - лучшая ОС в мире.