次の内容を含む `StandardDefaults.txt ファイルがあります。
[MetaInfo]
fileName="BUStandardDefaultsFile.dat"
schemaVersion="2"
schemaLocation="sftp:/var/app/napsgl/cgdata/GLFSUTN1/intfc/dsmtout/ISG/Schema/BUStandardDefaultsFileSchema_02.json"
generationTime="2023-06-13T10:19:13.060606"
process_time"2023-06-14T08:29:13.060606"
recordsCount=1041
generationTime
期待される出力値に関連する日付を抽出する必要があります。
2023-06-13
私はファイルからインポートを試しましたgrep
。generationTime
しかし、日付値を抽出するのに助けが必要です。日付値を文字列に保存したいです。その後、さらなる処理に使用されます。
答え1
そしてawk
:
awk -F'["T]' '/^generationTime/ {print $3}' StandardDefaults.txt
2023-06-13
これは、またはフィールド区切り文字としてawk
使用し、次に始まる入力行に3番目のフィールドを印刷するように指示します。"
T
generationTime
なぜ3番目のフィールドですか?大文字のためT
(generationTime
前のすべての内容は$ 1です)、2番目のフィールド$ 2は"
そこから最初の文字までのすべての内容であり、3番目のフィールドである$ 3はそこから次のものまでですT
。
generation T ime= " 2023-06-13 T 10:19:13.060606 "
$1 FS $2 FS $3 FS $4 FS $5
FS はフィールド区切り文字を表します。最後のフィールド区切り文字の後に何もないので、$ 5は空です"
。NF
に重要かもしれませんNF
)。
awk(またはstdoutで印刷するすべてのプログラム)の出力を変数に保存するには、次のようにします。コマンドの置き換え、例えば:
$ myvar=$(awk -F'["T]' '/^generationTime/ {print $3}' StandardDefaults.txt)
$ echo $myvar
2023-06-13
答え2
これにより、sed
次のように目的の部分を抽出できます。
sed -n 's/.*generationTime="\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)T.*/\1/p' StandardDefaults.txt
あるいは、より短いバリエーションはgrep -Po
Perl互換の正規表現を使用することです。
grep -Po '(?<=generationTime=")[^T]*' StandardDefaults.txt
答え3
PHPが認識するINIファイルの種類によく似ているように見えない値とそれ以外の=
場合は、次のことができます。process_time
parse_ini_file()
php -r '
$ini = parse_ini_file($argv[1], true);
echo $ini["MetaInfo"]["generationTime"] . PHP_EOL;
' -- your-file.ini
これをシェル変数に入れるには:
time=$(
php -r '
$ini = parse_ini_file($argv[1], true);
echo $ini["MetaInfo"]["generationTime"];
' -- your-file.ini
)
いつものように。その後、T...
その部分を削除する${time%%T*}
か、次を使用してPHPから削除できます。
date=$(
php -r '
$ini = parse_ini_file($argv[1], true);
echo stristr($ini["MetaInfo"]["generationTime"], "T", true);
' -- your-file.ini
)
これも有効です。TOMLしたがって、次のものを使用できます(tomlq
フロントエンドを含む)。jq
yq
time=$(tomlq -r '.MetaInfo.generationTime' your-file.ini)
date=$(tomlq -r '.MetaInfo.generationTime|sub("T.*"; "")' your-file.toml)
ほとんどのプログラミング言語にはTOMLを解析するモジュールがあります。 3.11以降、python3
基本的な配信は次のようになります。
date=$(python3 -c '
import tomllib
import sys
c = tomllib.load(sys.stdin.buffer)
print(c["MetaInfo"]["generationTime"].partition("T")[0])
' < your-file.toml
)
通常、デフォルトではインストールされていませんが、Perl用もいくつかあります。たとえば、次のようになりますTOML::Tiny
。
date=$(
perl -0777 -MTOML::Tiny -ne '
print from_toml($_)->{MetaInfo}->{generationTime} =~ s/T.*//r
' your-file.toml
)
これらのタイムスタンプにタイムゾーンの表示がないという事実は、その日付部分が現地時間と異なる可能性があることを意味するUTCである可能性があることを意味します。
たとえば、私がこの記事を書いている現在の時間は2023-06-16T06:45:10
UTCですが、2023-06-15T23:45:10
米国ロサンゼルスです。
$local_date
UTCタイムスタンプ(保存された情報など)の適切な情報を取得する2023-06-13T10:19:13.060606
には、次の手順を実行します。$time
zsh
zmodload zsh/datetime
TZ=UTC0 strftime -rs epoch '%Y-%m-%dT%H:%M:%S' ${time%.*} &&
strftime -s local_date %Y-%m-%d $epoch
Europe/London
時間帯の私には2023-06-13T10:19:13.060606
これが提供されますが、誰か2023-06-13
にPacific/Midway
2023-06-12
jq
(したがってtomlq
)日付の解析と書式設定も可能なので(マンページによるとまだ安定していませんが)、次のようになります。
local_date=$(
tomlq -r '.MetaInfo.generationTime |
sub("\\.\\d+$"; "") |
strptime("%Y-%m-%dT%H:%M:%S") |
mktime |
strflocaltime("%Y-%m-%d")' your-file.toml
)