シェルスクリプトのファイル行から指定された日付を抽出する

シェルスクリプトのファイル行から指定された日付を抽出する

次の内容を含む `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

私はファイルからインポートを試しましたgrepgenerationTimeしかし、日付値を抽出するのに助けが必要です。日付値を文字列に保存したいです。その後、さらなる処理に使用されます。

答え1

そしてawk

awk -F'["T]' '/^generationTime/ {print $3}' StandardDefaults.txt
2023-06-13

これは、またはフィールド区切り文字としてawk使用し、次に始まる入力行に3番目のフィールドを印刷するように指示します。"TgenerationTime

なぜ3番目のフィールドですか?大文字のためTgenerationTime前のすべての内容は$ 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 -PoPerl互換の正規表現を使用することです。

grep -Po '(?<=generationTime=")[^T]*' StandardDefaults.txt

答え3

PHPが認識するINIファイルの種類によく似ているように見えない値とそれ以外の=場合は、次のことができます。process_timeparse_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フロントエンドを含む)。jqyq

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:10UTCですが、2023-06-15T23:45:10米国ロサンゼルスです。

$local_dateUTCタイムスタンプ(保存された情報など)の適切な情報を取得する2023-06-13T10:19:13.060606には、次の手順を実行します。$timezsh

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-13Pacific/Midway2023-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
)

関連情報