Как работать с командой даты в сценарии bash через переменную

# apt install firmware-linux-nonfree

обычно решает такие проблемы

1
17.10.2019, 06:45
2 ответа

Ваша проблема в том, что вы передаете слишком много данных в dateс помощью xargs. Кроме того, вы не передаете дополнительную текстовую строку в конце, чтобы сделать ее частью вывода.

Было бы лучше сделать всю операцию в скрипте awk. Как в GNU awk, так и в mawkесть функции для основных манипуляций с отметками времени :

.
{
        YYYY    = substr($1, 1, 4)   # year
        mm      = substr($1, 5, 2)   # month
        dd      = substr($1, 7, 2)   # day
        HH      = substr($1, 9, 2)   # hour
        MM      = substr($1, 11, 2)  # minute
        SS      = substr($1, 13, 2)  # seconds
        sss     = substr($1, 15, 3)  # fractional seconds

        text    = substr($1, 18)     # the rest

        tm = mktime(sprintf("%s %s %s %s %s %s", YYYY, mm, dd, HH, MM, SS))
        printf("%s.%s %s\n", strftime("%Y-%m-%dT%H:%M:%S", tm, 1), sss, text)
}

Это выделяет различные компоненты входной временной метки в различные переменные, используя substr(). Затем время Unix вычисляется с использованием mktime()(. Предполагается, что входное время находится в местном часовом поясе ), и оно преобразуется в строку временной метки (UTC )в соответствующем формате с использованием strftime().

Обратите внимание, что доли секунды(sssв коде )никогда не являются частью вычислений времени, а вместо этого просто передаются как есть из ввода в вывод.

Запуск:

$ awk -f script.awk file
2019-10-14T14:16:53.042 nmd
2019-10-14T14:16:53.052 egc
2019-10-04T06:19:01.490 egc
2019-10-04T06:19:01.493 nex
2019-10-04T06:19:01.497 nex
2019-10-04T06:19:02.531 nex
2019-10-04T06:19:02.534 ksd

См. документацию по mktime()и strftime()в вашем руководстве awk.

2
27.01.2020, 23:30

Это версия с использованием sed и bash

 sed -re 's/^([0-9]{8})([0-9]{2})([0-9]{2})([0-9]{2})(([0-9]{3,}){0,1})([a-z].*)$/D="\1\ \2:\3:\4";M="\5";E="\7"/' /tmp/tmpfile  |\ 
  xargs -d'\n' -I=:= bash -c  '(=:=;echo $(date -u +"%Y-%m-%dT%H:%M:%S.$M" -d "TZ=\"America/New_York\" $D" )  $E)'

я сделал только 1 шаг, чтобы избежатьawk + sed
я удалил все \во второй части sed

я использую параметр -Ixargs, чтобы указать, где я буду использовать свой аргумент, например {}вfind

чтобы не использовать дату дважды, я использую опцию TZв опции -dдаты

Здесь я использую America/New_Yorkв качестве часового пояса для ввода, вы должны изменить его на правильное значение.

0
27.01.2020, 23:30

Теги

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