「22.09.201608:22:54」(「+%Y:%m:%d%H:%M:%S」)の形式のタイムスタンプを持つログファイルがあります。このタイムスタンプはUTCタイムゾーンです。
次に、bashスクリプトを使用して、このタイムスタンプをヨーロッパ/ヘルシンキのタイムスタンプに変換する必要があります。
私は私が望むように変換を行うこのスクリプトを持っています。
#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "2015-05-20 18:05:02")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"
これは正常に機能しますが、日付の「入力」形式(-d "2015-05-20 18:05:02")は、ログのタイムスタンプ形式とは異なる形式です。
このスクリプトを次のようなものに変更したいと思います。
#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"
$ 1は、ログファイル "22.09.2016 08:22:54"( "+%Y:%m:%d%H:%M:%S")の元の日付形式にすることができます。
私はこれを機能させることができません..誰かがこれを手伝ってくれますか..ありがとう
編集:
私はこのようなものと他の多くの組み合わせを試しました。
#!/bin/sh
sec=$(TZ="UTC" date +'%s' "+%Y:%m:%d %H:%M:%S" -d "$1")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"
しかし、彼はエラーで終わります。
date: extra operand ‘+%Y:%m:%d %H:%M:%S’
Try 'date --help' for more information.
date: invalid date ‘@’
date
は入力フォーマット文字列をサポートしているようには見えません。そのため、先に進んで文字列を現在まで渡すことはできません。マニュアルページには、通常の形式を受け入れると記載されているため、ロケール設定がこれに影響を与える可能性がありますが、それについてはよくわかりません。
さらに、スクリプトを見てみましょう。
#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
$(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")
ここで何が起こるかというと、$1
パラメーターをLinuxタイムスタンプに変換してから、それを必要な文字列に再度変換します。入力でこれを機能させるための1つの可能なアプローチは、$1
文字列パラメーターを再フォーマットすることです。
例として、適切な正規表現でsed
を使用してこれを行うことができます。事前に有効な文字列があることを確認する必要があり、形式を変更するとこれが壊れる可能性があることに注意してください。
#!/bin/bash
intputdate=$(echo $1 | sed -re 's/([0-9]{2})\.([0-9]{2})\.([0-9]{4})/\3-\2-\1/')
sec=$(TZ="UTC" date +'%s' -d "$intputdate")
echo $(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")
編集:間違った変数名を持たないことは確かに役立ちます。
MacOS(10.14.3)では、-f
スイッチを介して正確な形式を提供できるため、非常に正常に機能します。
$ d1="22.09.2016 08:22:54"
$ sec=$(TZ="UTC" date -j -f "%d.%m.%Y %H:%M:%S" "$d1" "+%s")
1474532574
$ TZ="Europe/Helsinki" date -j -f "%s" "$sec" "+%Y:%m:%d %H:%M:%S"
2016:09:22 11:22:54
ちなみに、ログ形式は"+%d.%m.%Y %H:%M:%S"
であり、2番目のコードスニペットの後に記載されている"+%Y:%m:%d %H:%M:%S"
ではありません。そうしないと、上記のコードでsec
が定義されている行で、illegal time format
エラーなどがスローされる可能性があります。
これは少し見栄えが良く、NZ時間をモナコ時間に変換します。
TZ = "Europe/Monaco" date --date = "TZ = \" Pacific/Auckland\"2017-10-11 00:51" +%Y-%m-%d \%H:%M:%S
2017-10-10 13:51:00
#!/bin/bash
new_zealand_time="2017-10-12 00:56"
monaco_time=$(TZ="Europe/Monaco" date --date="TZ=\"Pacific/Auckland\" $new_zealand_time" +%Y-%m-%d\ %H:%M:%S)
echo "Time in Monaco: $monaco_time"
モナコでの時間:2017-10-11 13:56:00