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"