В сценарии оболочки, как go в файл и заменить каждый экземпляр строки с повторяющейся отметкой времени - PullRequest
0 голосов
/ 29 марта 2020

Мне нужно go в каталог из нескольких тысяч файлов записей в журнале, который содержит каждую строку формата:

timestamp: REPLACE_ME

и заменить каждый его экземпляр РАЗЛИЧНОЙ итеративной датой-временем около Шаг 5 минут.

То есть:

first instance of "REPLACE_ME" -> March,1,2020: 00:00:05 
second instance of "REPLACE_ME" -> March,1,2020: 00:00:10
...
...
...
nth instance of "REPLACE_ME" -> March,1,2020 23:55:55

, а затем "l oop вокруг"

n+1th instance of "REPLACE_ME" -> March,1,2020, 00:00:00

Я пробовал что-то вроде

sed -i "0,/${REPLACETEXT}/ s/${REPLACETEXT}/${DATE_VAR}/" ${FILE}

в al oop, но это настолько неэффективно (минуты, чтобы обработать файл на несколько МБ), что это неприемлемо.

Цель, по которой я это делаю, заключается в том, что я пытаюсь сгенерировать «поддельные журналы» с приращением отметки времени, где каждое событие происходит ровно с 5-минутным интервалом. К сожалению, используемое мной решение для генерации журналов Json (log-synth) не поддерживает добавочные временные метки. Поэтому я пытаюсь понять, как это сделать в Bash.

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Чистый bash (используя встроенные функции). Оборачивается через 24 часа без смены дня.

#!/bin/bash

date="March 1, 2020"

ts=0
re='^(timestamp: )REPLACE_ME$'

while IFS= read -r line ; do
    [[ $line =~ $re ]] && {
        line="${BASH_REMATCH[1]}$(printf "%s %02d:%02d:%02d" "$date" $((ts/3600)) $(((ts/60)%60)) $((ts%60)))"
        let 'ts=(ts+5)%86400' # advance by 5 seconds, wrap after 24hrs
        #let 'ts=(ts+300)%86400' # advance by 5 minutes, wrap after 24hrs
    }
    printf "%s\n" "$line"
done
0 голосов
/ 30 марта 2020

Вы можете использовать команду date для увеличения даты и времени и вернуть значение в ожидаемом формате:

$ TZ=UTC date --date='2020-03-01 00:00:00Z + 5 minutes' '+%B,%d,%Y %H:%M:%S'
March,01,2020 00:05:00

Затем вам нужно l oop над содержимым файла, как это ( не проверено):

current_date='2020-03-01 00:00:00Z'
while IFS= read -r line
do
    sed -i "s/REPLACE_ME/$(TZ=UTC date --date="$current_date" +%B,%d,%Y %H:%M:%S)/" "$line"
    current_date="$(TZ=UTC date --date="$current_date + 5 minutes")"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...