Unix 스크립트에서 날짜와 시간을 자르는 방법

Unix 스크립트에서 날짜와 시간을 자르는 방법

cut 또는 기타 유사한 명령을 사용하여 날짜와 시간을 얻는 방법을 묻고 싶습니다. 기본적으로 다음 $line에서 검색합니다 for loop.

for line in $(cat $file);
do
   getdatetime=$(echo $line | cut -f4 -d,)
done

샘플 값은 다음과 같습니다 $line.

883427446627317909,1114259,1573178423,2019-11-08 02:00:23,RD,4.7,0,351442429

파일에는 $file예제와 유사한 여러 줄이 포함되어 있습니다 $line.

예상 값은 다음과 같습니다 getdatetime.

2019-11-08 02:00:23

하지만 날짜만 알 수 있습니다.

2019-11-08

cut날짜와 시간을 추출하는 한 줄 명령이 있습니까 ? for 루프의 구조를 보존해야 합니다. 감사해요.

답변1

따옴표가 없는 명령 대체를 반복하면 $(cat $file)모든 명령을 반복합니다.성격cat $file단어는 공백(기본적으로 공백, 탭 또는 줄바꿈)으로 구분된 모든 항목이 될 수 있습니다. 이는 $file행 중 하나 에 대해

883427446627317909,1114259,1573178423,2019-11-08 02:00:23,RD,4.7,0,351442429

883427446627317909,1114259,1573178423,2019-11-08두 개의 단어 를 얻게 됩니다 02:00:23,RD,4.7,0,351442429(즉, 루프는 이 줄에 대해 두 번 반복됩니다). 즉, 행 의 2019-11-08첫 번째 반복과 0두 번째 반복이 진행됩니다.

해결책은아니요명령 대체를 인용하면 루프가 반복됩니다.한 번파일의 전체 내용을 읽습니다 $line. 해결책은아니요IFS다음과 같이 개행 문자로 설정하세요 .우아하지 않은cut(반복당 한 번씩 호출해야 합니다).

대신, 원하는 데이터를 구문 분석하고 한 번의 호출로 읽으십시오 cut.

while IFS= read -r datetime; do
    # use "$datetime" here
done < <( cut -d, -f4 "$file" )

while이는 프로세스 대체를 사용하여 루프에서 읽을 입력 스트림을 생성합니다 . 이 스트림의 데이터에는 파일 이름이 쉼표로 구분된 네 번째 필드가 포함됩니다 $file.

또는 while서브셸에서 루프를 사용하세요.

cut -d, -f4 "$file" |
while IFS= read -r datetime; do
    # use "$datetime" here
done

사용하면 awk폐기가 더 깨끗해질 것입니다(당신이필요어떤 이유로든 날짜/시간 값을 쉘 변수로 사용하는 경우):

awk -F , '{ datetime = $4; ... more code here using the datetime variable }' "$file"

관련 독서:

답변2

cut실제로는 다음 사항 없이도 할 수 있습니다.

while IFS=, read _ _ _ stamp _ ; do
  echo "do something with $stamp here"
done < "$file"

조금 분석하면 다음과 같습니다.

IFS=,임시로 레코드 구분 기호를 다음으로 설정합니다.,

read _ _ _ stamp _필드 1-3 및 5를 일회성 변수에 저장하고 필드 4(날짜/시간)를 다음과 같이 캡처합니다.stamp

< "$file"소스 파일을 읽습니다(명령 으로 read캡처 됨).

이 고양이의 스킨을 다시 지정하는 또 다른 방법은 배열을 각 줄로 채우는 것입니다(이것은 확실히 bash에서 작동하며 다른 쉘에서는 이를 지원하지 않거나 다르게 구현할 수 있습니다).

while IFS=, read -a line ; do echo "${line[3]}" ; done < "$file"

관련 정보