JQ конвертировать часовой пояс в bash скрипт - PullRequest
0 голосов
/ 04 мая 2020

У меня есть запрос, как показано ниже:

dump=$(jq -j --raw-output '.aggregations | ."2" | .buckets[] | "\(.key),",
                                       (."5" | .buckets[] | "\(.key),",
                                       (."3" | .buckets[] | "\(.key),",
                                       (."4" | .buckets[] | "\(.key),",
                                       (."8" | .buckets[] | "\(.key),",
                                       (."6" | .buckets[] | "\(.key),",
                                       (."7" | .buckets[] | "\(.key),",
                                       (."9" | .buckets[] | "\(.key),",
                                       (."10" | .buckets[] | "\(.key),",
                                       (."11" | .buckets[] | "\(.key),",
                                       (."12" | .buckets[] | "\(.key),",
                                       (."13" | .buckets[] | "\(.key),",
                                       (."14" | .buckets[] | "\(.key),",
                                       (."15" | .buckets[] | "\(.key),",
                                       (."1" | ."hits" | .hits[] | ."_source" |
                                           "\(."@timestamp")" | "\n"))))))))))))))' <<< "$cl_report")
echo -e "${dump}" >> report.csv

метка времени в формате ISO8601.

Я хочу преобразовать метку времени из UT C в мадридское время .

Мне нужно что-то вроде this :

dump=$(jq -j --raw-output '.aggregations | ."2" | .buckets[] | "\(.key),",
                                       (."5" | .buckets[] | "\(.key),",
                                       (."3" | .buckets[] | "\(.key),",
                                       (."4" | .buckets[] | "\(.key),",
                                       (."8" | .buckets[] | "\(.key),",
                                       (."6" | .buckets[] | "\(.key),",
                                       (."7" | .buckets[] | "\(.key),",
                                       (."9" | .buckets[] | "\(.key),",
                                       (."10" | .buckets[] | "\(.key),",
                                       (."11" | .buckets[] | "\(.key),",
                                       (."12" | .buckets[] | "\(.key),",
                                       (."13" | .buckets[] | "\(.key),",
                                       (."14" | .buckets[] | "\(.key),",
                                       (."15" | .buckets[] | "\(.key),",
                                       (."1" | ."hits" | .hits[] | ."_source" | "\ 
                                       (."@timestamp") as $tstamp | "TZ Europe/Madrid" date -d $tstamp" | \n"))))))))))))))' <<< "$cl_report")

Bash выдает ошибку с жалобами на "and 'et c et c.

Как правильно выполнить это преобразование?

Хорошо. Кажется, есть ошибка с jq 1.5. Strftime et c неправильно читает TZ в этой версии.

jq 1.6 может помочь:

report_dump=$(TZ=Erope/Madrid jq1.6 -j --raw-output '.aggregations | ."2" | .buckets[] | "\(.key),",
                                       (."5" | .buckets[] | "\(.key),",
                                       (."3" | .buckets[] | "\(.key),",
                                       (."4" | .buckets[] | "\(.key),",
                                       (."8" | .buckets[] | "\(.key),",
                                       (."6" | .buckets[] | "\(.key),",
                                       (."7" | .buckets[] | "\(.key),",
                                       (."9" | .buckets[] | "\(.key),",
                                       (."10" | .buckets[] | "\(.key),",
                                       (."11" | .buckets[] | "\(.key),",
                                       (."12" | .buckets[] | "\(.key),",
                                       (."13" | .buckets[] | "\(.key),",
                                       (."14" | .buckets[] | "\(.key),",
                                       (."15" | .buckets[] | "\(.key),",
                                       (."1" | ."hits" | .hits[] | ."_source" | .["@timestamp"] | sub(".[0-9]+Z$"; "Z") | fromdateiso8601 | strflocaltime("%Y-%m-%dT%H:%M:%S %Z"), "\n"))))))))))))))' <<< "$cl_report")

Как показано выше, я передал выделенную временную метку в fromdateiso8601, чтобы получить секунды, а затем передал ее в strflocaltime, которая использует TZ для получения местного времени. .

1 Ответ

0 голосов
/ 05 мая 2020

К сожалению, обработка jq локальных часовых поясов была проблематичной, и вам может потребоваться адаптировать следующее в соответствии со спецификой вашей версии jq (т. Е. Номер версии и платформа).

Вот иллюстрация с использованием Переменная среды TZ, например,

TZ=Europe/Madrid jq -n -f program.jq

, где program.jq содержит:

{"@timestamp": "2020-05-04T18:02:13Z"}
| .["@timestamp"]
| fromdateiso8601   # converts to seconds
| gmtime
| strftime("%Y-%m-%dT%H:%M:%S%Z")

Вывод: "2020-05-04T19:02:13CET"

Примечание:% Z становится CET.

...