쉘 스크립트의 파일 행에서 지정된 날짜 추출

쉘 스크립트의 파일 행에서 지정된 날짜 추출

다음 내용이 포함된 `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사용 하고 다음으로 시작하는 입력 줄에 세 번째 필드를 인쇄하도록 지시합니다."TgenerationTime

왜 세 번째 필드인가요? 대문자로 인해 T( generationTime이전의 모든 내용은 $1입니다.) 두 번째 필드 $2는 "거기에서 첫 번째 문자까지의 모든 내용이고, 세 번째 필드인 $3은 거기에서 다음까지의 모든 내용입니다 T.

generation   T  ime=   "  2023-06-13   T  10:19:13.060606   "
    $1      FS   $2   FS      $3      FS        $4         FS   $5 

FS는 필드 구분 기호를 나타냅니다. 마지막 필드 구분 기호 뒤에 아무것도 없기 때문에 $5는 비어 있습니다 "(그러나 awk는 여전히 이를 행의 다섯 번째 필드로 계산하므로 awk의 필드 카운터 변수는 NF5와 같습니다... 여기서는 그렇지 않습니다. 중요하지만 어떤 방식으로든 사용되는 스크립트에 중요 할 수 있습니다 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-13에게는Pacific/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
)

관련 정보