다음 내용이 포함된 `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
사용 하고 다음으로 시작하는 입력 줄에 세 번째 필드를 인쇄하도록 지시합니다."
T
generationTime
왜 세 번째 필드인가요? 대문자로 인해 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의 필드 카운터 변수는 NF
5와 같습니다... 여기서는 그렇지 않습니다. 중요하지만 어떤 방식으로든 사용되는 스크립트에 중요 할 수 있습니다 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
)