
日付を解析しようとしています2017-03-08T19:41:26Z
。
希望の出力は2017-03-08です。
答え1
POSIXシェルを使用して前の部分を抽出するには、次のようにしますT
。
time=2017-03-08T19:41:26Z
utc_date=${time%T*} # as already said
または Bourne または非 POSIX シェルと互換性があります。
expr "$time" : '\(.*\)T'
2017-03-08T19:41:26Z
さて、これを参考にしてください。ジュール時間(UTCの別の名前)、正確な瞬間の明確な仕様です。
当時、ロンドンの日付は2017-03-08でしたが、バンコクの日付は2017-03-09(夜明け)でした。
知りたいなら地元の時間指定日(UTC日付ではありません)、つまりバンコクユーザーは2017-03-09を、ロンドンユーザーは2017-03-08を取得します。いくつかのオプションがあります。
GNUの使用date
:
time=2017-03-08T19:41:26Z
date -d "$time" +%F
(GNU日付はzulu形式を認識できるので非常に簡単です。)
ksh93
同じ
printf '%(%F)T\n' "$time"
組み込みzsh
機能:
zmodload zsh/datetime
TZ=UTC0 strftime -rs unix_time %Y-%m-%dT%TZ $time &&
strftime %Y-%m-%d $unix_time
(これをサポートするシステム(GNUシステムなど)でそれを置き換えることができます%Y-%m-%d
)。%F
strftime()
strptime()
似ていますbusybox date
:
unix_time=$(date -u -D %Y-%m-%dT%TZ -d "$time" +%s)
date -d "@$unix_time" +%Y-%m-%d
答え2
使用cut
:
cut - ファイルの各行から部分を削除します。
-d, --delimiter=DELIM フィールド区切り文字として TAB の代わりに DELIM を使用します。
-f, --fields=LIST このフィールドのみを選択します。 -sオプションが指定されていない場合は、区切り文字を含まないすべての行も印刷します。
echo "2017-03-08T19:41:26Z" | cut -d T -f 1
答え3
Bashではできますパラメータ拡張可変的な:
timestamp='2017-03-08T19:41:26Z'
date=${timestamp:0:10} # pick 10 characters starting at position 0
date=${timestamp%T*} # remove everything starting at the 'T'
(${variable%pattern}
実際には標準のシェル言語の一部であり、そのような単純なシェルでもサポートされていますdash
。)
もちろん、これは単なる部分文字列操作です。本当に欲しいなら分析するその日が来たら、別のことをしなければなりません。もちろん、フォーマットは固定幅なので、部分文字列拡張はこれに適しています。ただし、値が有効かどうかなどを確認したい場合があります。
答え4
それでは、すべての数字 - ダッシュ - 数字 - ダッシュ - 数字を見つけるだけで十分ですか?これは、日付の後に「T」がなくても長い文字列/行に適用されます。
grep -o "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
または同等ですが、中かっこ「繰り返し/複数回」を使用すると、少し短くなります。
grep -o '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}'
前任者:
$ echo 2017-03-08T19:41:26Z | grep -o '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}'
2017-03-08
入力に他のダッシュがない場合は、4文字、ダッシュ、2文字、ダッシュ、2文字以上を検索できます。
$ echo 2017-03-08T19:41:26Z | grep -o '....-..-..'
2017-03-08