Подсчет количества раз, когда следующая запись в журнале появлялась через одну или более минут, чем предыдущая

Для следующего требуется bash4.4 или новее, GNU findи GNUsed(или, по крайней мере, findи sed, которые поддерживают NUL в качестве разделителя вывода/ввода):

$ mapfile -d '' files < <(find. -maxdepth 1 -type f -iname '*0728*.dat' -print0 | 
    sed -z 's:^\./::; s/[0-9][0-9_]\+.dat//')

Это заполняет массив bash(files)совпадающими именами файлов в текущем каталоге после того, как у них был начальный ./и расширение даты и времени и.dat, удаленное sed. Он использует NUL в качестве записи (, то есть разделителя имени файла ), чтобы избежать любых потенциальных проблем с пробелами, переводами строк -, мета-символами оболочки -и т. д. в любом из имен файлов.

findиспользуется, потому что вы никогда не должны использовать вывод lsв качестве входных данных для других программ или в качестве аргументов в команде другой программы -, строка -, это небезопасно и ненадежно. См. Почему не разборls(и что делать вместо )?

Команда find, конечно, может быть изменена для поиска файлов, соответствующих различным шаблонам, или в подкаталогах -и т. д.

Пример:

$ touch amnbmnbm_jnjmnm_sd_07282019_14_13_17.dat amnbmnb_kjhkj_07282019_11_23_22.dat \
    njnkjnjk_AbnBCBB_DE_07282019_07_09_04.dat

$ mapfile -d '' files < <(find. -maxdepth 1 -type f -iname '*0728*.dat' -print0 | 
    sed -z 's:^\./::; s/[0-9][0-9_]\+.dat//')

$ typeset -p files
declare -a files=([0]="amnbmnbm_jnjmnm_sd_" [1]="amnbmnb_kjhkj_" [2]="njnkjnjk_AbnBCBB_DE_")

$ printf '%s\n' "${files[@]}"
amnbmnbm_jnjmnm_sd_
amnbmnb_kjhkj_
njnkjnjk_AbnBCBB_DE_

0
07.11.2021, 12:06
1 ответ

Решением проблем, связанных со сравнением времени, является преобразование даты и времени в целое число секунд. Затем, если вы помните отметку времени из предыдущей записи, вы можете выполнить арифметические действия, чтобы найти различия, превышающие 60 секунд.

GNU awk имеет некоторые функции времени, встроенные -в

gawk -F'[. :]+' '
    {timestamp = mktime($1" "$2" "$3" "$4" "$5" "$6)}
    NR == 1 {prev = timestamp}
    timestamp - prev >= 60 {print}
    {prev = timestamp}
' selfdriving.log
2021.04.01. 13:16:59:87 86 116 119
2021.04.01. 13:18:50:65 75 96 109

Чтобы получить количество записей, вы можете

  1. конвейер, который выводится в | wc -l, чтобы получить количество, или
  2. выполнить подсчет в awk и вывести результат в блоке END.
5
07.11.2021, 13:46

Теги

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