awk를 사용하여 날짜 인쇄 및 편집

awk를 사용하여 날짜 인쇄 및 편집

원하는 출력을 얻기 위해 한 줄 명령을 찾고 있습니다. 일반 텍스트는 다음과 같습니다: "test_list_20160915_bla.log" 원하는 출력: "2016/09/15"

두 개의 awk 명령을 사용하여 이 작업을 수행할 수 있습니다(명령은 연도만 인쇄한다는 것을 알고 있습니다. 이는 단지 목적에 따른 것입니다).

echo "test_list_20160915_bla.log" |awk -F_ '$3 ~ /[0-9]/ {print $3}' |awk 'BEGIN {OFS="/"} {print substr($1,1,4)}'

하지만 1 명령에서 어떻게 사용합니까? awk가 올바른 도구인가요? 아마도 sed도 같은 일을 할 수 있을 것입니다. 하지만 저는 awk에 더 익숙합니다.

제공된 솔루션에 몇 가지 문제가 있습니다. 때때로 "test_20161205145213.log"와 같은 파일이 있습니다. sed 명령을 사용하면 "2051/45/21"과 같은 결과가 출력되는데 이는 매우 좋지 않습니다. 몇 가지를 시도했지만 알 수 없습니다.

이것을 전환했습니다

 sed -r 's!^.*_([0-9]{4})([0-9]{2})([0-9]{2})_.*$!\1/\2/\3!'

도착하다

 sed -r 's!^.*(20[0-9]{2})([0-9]{2})([0-9]{2}).*$!\1/\2/\3!'

이는 오류 출력을 2시간 타임스탬프로 제한합니다. 차라리 파일 이름을 완전히 무시하고 그 안에 있는 타임스탬프만 찾아보고 싶습니다.

타임스탬프는 yyymmdd_hhmmss 또는 yyymmddhhmmss일 수 있습니다. yyyy/mm/dd 부분만 필요합니다. 문제는 고정 길이나 필드 구분 기호가 없다는 것입니다.

답변1

awk동일한 스크립트에서 슬라이스 및 다이싱을 수행 할 수 있습니다 .

echo "test_list_20160915_bla.log" |
    awk -F_ '$3 ~ /^[1-9][0-9]*$/ { print substr($3,1,4) "/" substr($3,5,2) "/" substr($3,7,2) }'

여기서는 세 번째 "_"로 구분된 필드에서 연, 월, 일 숫자 그룹을 추출하여 출력합니다.

또는 sed추가 요구 사항도 충족할 수 있는 를 사용하세요.

(
    echo "test_list_20160915_bla.log"
    echo "test_20161205145213.log"
) |
    sed -r 's!^.*_([0-9]{4})([0-9]{2})([0-9]{2}).*$!\1/\2/\3!'

여기서는 정규식을 사용하여 연도, 월, 일의 세 자리 그룹을 캡처하고 나머지는 모두 버린 다음 세 그룹을 인쇄하고 로 연결합니다 /.

관련 정보