LINUX.ORG.RU

bash найти в фале и заменить подстроку если найденное значение больше чем эталон

 , , , ,


0

0

Доброго Вам времени суток!

Подскажите как можно решить задачу:

есть входной файл вида:

EndTime v="27.05.2021 17:09:00"
UserTime v="28.05.2021 18:20:15"
UserTime v="27.05.2021 12:20:34"
UserTime v="27.05.2021 21:12:14"

EndTime забираем в переменную:

ENDTIME="$(cat "${file}" |  grep "EndTime" | sed 's/.*v=\"\(.*\)\".*/\1/' )"

далее надо получить такой-же файл, но значения позже (посимвольно больше) чем в переменной, заменить на значения из переменной $ENDTIME

EndTime v="27.05.2021 17:09:00"
UserTime v="27.05.2021 17:09:00"
UserTime v="27.05.2021 12:20:34"
UserTime v="27.05.2021 17:09:00"

Можно было бы через hold space и pattern space попробовать, но ума не приложу, как в sed или awk вставить сравнение результата со строкой.

Есть мысли?

Какая проблема в awk сравнивать строки?

Запись:

cat | grep | sed
отбивает у многих желание что-либо сюда писать, ИМХО, так что особо не расчитывайте на ответы.

mky ★★★★★ ()

Есть мысли?

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

vodz ★★★★★ ()
Ответ на: комментарий от shell-script

Лучше таки преобразовать в unixtime

Нет. Ибо задачи считать значение разности — не стоит.

vodz ★★★★★ ()
Ответ на: комментарий от mky

Спасибо за подсказку «awk сравнивать строки» для правильного запроса в гугл! Тема закрыта!

awk -v TimeModify="${TIME}\"" -v Yesterday="v=\"${YESTERDAY}" '{ if ($2=="n=\"UserLoginTime\"" && $4 > TimeModify ) { $3 = Yesterday; } print($0);}'

Работает на CentOS

sewernyi ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей