![섹션 교체 방법에서 Sed Regex 캡처 그룹 사용](https://linux55.com/image/138198/%EC%84%B9%EC%85%98%20%EA%B5%90%EC%B2%B4%20%EB%B0%A9%EB%B2%95%EC%97%90%EC%84%9C%20Sed%20Regex%20%EC%BA%A1%EC%B2%98%20%EA%B7%B8%EB%A3%B9%20%EC%82%AC%EC%9A%A9.png)
다음 형식의 타임스탬프 파일 이름 목록이 있습니다.
cat files
- ..201807010112. 통나무
- ..201807020112. 통나무
- ..201807022359. 통나무
- ..201807030112. 통나무
- ..201807010412. 통나무
특정 범위를 얻어야 하며 이를 위해 SED를 사용하고 싶습니다.
sed -n '/201807010112/,/201807030112/p'
이것은 나의 첫 번째 시도이지만 sed가 시간과 분을 처리하는 방식은 이상하고 짧게 말하면 형식을 올바르게 이해하지 못합니다.
문제가 생길 수도 있지만 이 문제를 해결하기 위해 SED가 이해할 수 있는 형식으로 변환하기로 결정했습니다.
cat files | sed -e "s/\([0-9]\{12\}\}/$(date -f '%Y%m%d%H%M' \1)/g"
내 문제는 경기 결과를 사용할 수 없다는 것입니다\1날짜 변환 블록에서.
이를 수행하는 방법이나 날짜 범위를 얻는 더 좋은 방법이 있습니까?
답변1
귀하의 질문에 따르면 특정 날짜 범위 내의 특정 로그 파일 이름을 가져와야 한다고 나와 있습니다.
파일 이름이 텍스트 파일에 있다는 사실을 무시하고 대신 디렉토리에 있는 파일에 직접 액세스할 수 있다고 가정해 보겠습니다 $logdir
.
파일 이름의 형식은 *_YYYYMMDDhhmmss.log
후행 비트가 표준 타임스탬프 문자열이라는 것입니다.
*_201807010112.log
루프 안팎에서 파일을 가져오려면 *_201807030112.log
(각 파일에 대해 작업 수행) (in bash
)을 사용합니다.
process_flag=0
for pathname in "$logdir"/*_??????????????.log
do
if [ "$process_flag" -eq 0 ]; then
if [[ "$pathname" == *_201807010112.log ]]; then
process_flag=1
else
continue
fi
fi
# Do some sort of processing of
# the logfile in "$pathname" here.
# When done...
if [[ "$pathname" == *_201807030112.log ]]; then
break
fi
done
이런 사이클이 돌아요모두유사한 파일 이름 형식을 가진 로그 파일입니다. 이 루프는 사전순으로 경로 이름을 반복합니다. 모든 파일이 동일한 파일 이름 접두사를 가지고 있다고 가정합니다(이에 대해 아무 말도 하지 않았습니다).
루프의 첫 번째 부분은 범위의 첫 번째 파일을 감지하고 해당 파일이 발견된 시간을 process_flag
설정 합니다. 수행해야 하는 파일 작업을 처리하는 데 실제로 사용하는 중간 비트에 루프가 들어갈 수 있도록 설정 1
하십시오 .process_flag
1
"$pathname"
다음 반복을 계속하기 전에 마지막 if
문은 현재 $pathname
파일이 처리하려는 마지막 파일과 일치하는지 확인합니다. 그렇다면 루프는 break
명령문으로 끝납니다.
답변2
그래서 나는 사용하지 않기로 결정했습니다날짜양식을 변환하는 함수를 사용하려면 대신 SED를 더 많이 사용하세요!
고양이 파일
..._201807010112.log
..._201807010132.log
..._201807010152.log
..._201807010202.log
날짜는 YYYYmmddHHSS 형식이며 다음 형식으로 변환합니다.
YYYY-mm-dd HH:SS SED에서 이 정규식을 사용하십시오.
cat files | sed -e 's/\(_[0-9]\{4\}\)\([0-9]\{2\}\) \
\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\) \/\1-\2-\3 \4:\5/g'
다음으로, 날짜를 기준으로 범위를 지정하는 것은 매우 쉽습니다.
| sed -n '/2018-07-01 01:20/,/2018-07-02 02:01/p'
저에게 가장 큰 교훈은 SED 범위 모드 옵션을 사용하여 올바른 날짜 시간 형식을 이해했다는 것입니다.