Во-первых, если у вас GNU awk
или mawk
, используйте решение awk
с mktime
, это будет на намного быстрее, чем зацикливание в скрипте bash. Однако вы запросили решение bash, и это нормально, если вы имеете дело с менее чем тысячей строк или около того.
Способ упрощения добавления разделителей состоит в преобразовании даты в секунды, так как эпоха. Затем, чтобы проверить, нужен ли разделитель, достаточно просто добавить 2 к последней отметке даты. Если не первая строка, выведите разделитель и обновите текущие секунды до секунд с начала эпохи. Выводить строку, прочитанную из файла, каждую итерацию независимо от этого.
Вы можете написать это довольно просто, читая каждую строку из файла с помощью read
и затем используя расширения параметра для удаления подстроки для обрезки. справа ']'
до конца и слева до '['
, оставляя только дату, которую можно использовать с date -d
, как вы пытались. Вы можете сделать что-то похожее на:
secs=0 # initialize seconds zero
while read -r line; do # read each line in log
dstr="${line%]*}" # trim from right through ']'
dstr="${dstr#*[}" # trim from left through '['
epoch=$(date -d "$dstr" +%s) # get seconds from epoch from date
if (((epoch-secs) > 2)); then # if current date 2 greater than secs
# if not first line, output the separator
((secs > 0)) && printf -- "------------------------------\n"
secs="$epoch" # update secs to epoch
fi
echo "$line" # output each line
done < file
Пример использования / вывода
При вводе в file
вы получите:
[02/03/2020 07:53:58.859000] 5
[02/03/2020 07:53:58.935300] 2
------------------------------
[02/03/2020 10:04:50.355600] 0
[02/03/2020 10:04:51.028900] 1
------------------------------
[02/03/2020 10:38:13.468200] 6
Хотя это делается относительно просто с date -d
и сравнениями, для больших журналов awk
(если у вас GNU awk или mawk
), то использование mktime
будет на порядка быстрее, чем решение сценария оболочки.