텍스트 한 줄을 (새 또는 기존) 파일로 이동합니다. 여기서 대상 (하위) 디렉터리는 소스 파일에 의해 결정됩니다.

텍스트 한 줄을 (새 또는 기존) 파일로 이동합니다. 여기서 대상 (하위) 디렉터리는 소스 파일에 의해 결정됩니다.

각 줄이 ISO8601 타임스탬프(Nginx)와 에포크 타임스탬프(Nginx)로 시작하여 $time_iso8601가장 가까운 밀리초까지 표시되는 사용자 지정 Nginx 액세스 로그가 있습니다. $msec이와 같이:

2023-01-16T20:19:57+00:00 1673900397.009 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.140 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.163 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.205 ips="…" rm="…" […]
2023-01-16T20:19:57+00:00 1673900397.210 ips="…" rm="…" […]

파일의 각 줄을 처음부터 시작하여 대상 대상이 ISO8601 타임스탬프 형식으로 연도, 월, 날짜를 기준으로 빌드된 (새 또는 기존) 파일로 줄을 이동하고 싶습니다 /yyyy/mm/dd/access.log. 예를 들어 위 코드 조각에서 각 행을 source 에서 access.logtarget 으로 이동하려고 합니다 /2023/01/16/access.log.

대상 디렉터리가 존재하지 않으면 새로 만들어야 합니다. 대상 파일이 없으면 생성해야 합니다.

yyyy, mm및 값을 추출하려면 어떤 도구를 사용하시겠습니까 dd?

답변1

더 나은 사용법 logrotate이나 nginx구성αГsнιn이 댓글에서 말했습니다.

awk단지 재미로 이것을 구현하고 싶다면 :

awk -F'[-T]' '{
    dir=$1"/"$2"/"$3
    rc=system("mkdir -p " dir)
    if (rc != 0) exit
    print $0 >> dir"/access.log"
    close(dir"/access.log")
}' access.log
# rm -f access.log

필드 구분 기호는 FS F대시 및 문자 클래스로 설정됩니다.S-F-T

출력 디렉터리/파일

$ find
./2023
./2023/01
./2023/01/16
./2023/01/16/access.log

관련 정보