CAT FILE, 날짜 열을 기준으로 행 정렬

CAT FILE, 날짜 열을 기준으로 행 정렬

웹 서버에 대한 로그 정보가 포함된 텍스트 파일이 있습니다.

날짜 형식: 일-월-년

샘플 콘텐츠:

/tmp/archive/9-10-2020/error_04.log.gz
/tmp/archive/9-10-2020/error_05.log.gz
/tmp/archive/9-7-2020/access_01.log.gz
/tmp/archive/9-7-2020/access_02.log.gz
/tmp/archive/9-7-2020/access_03.log.gz
/tmp/archive/9-7-2020/error_03.log.gz
/tmp/archive/9-7-2020/error_04.log.gz
/tmp/archive/9-7-2020/error_05.log.gz
/tmp/archive/9-8-2020/error_01.log.gz
/tmp/archive/9-8-2020/error_02.log.gz
/tmp/archive/9-8-2020/error_03.log.gz
/tmp/archive/9-8-2020/error_04.log.gz
/tmp/archive/9-8-2020/error_05.log.gz
/tmp/archive/9-9-2020/access_01.log.gz
/tmp/archive/9-9-2020/access_02.log.gz
/tmp/archive/9-9-2020/access_03.log.gz

날짜 순서(세 번째 열)로 나열하고 싶습니다. sort 명령을 시도했지만 날짜별로 정렬되지 않습니다.

예상 출력:

/tmp/archive/9-7-2020/access_01.log.gz
/tmp/archive/9-7-2020/access_02.log.gz
/tmp/archive/9-7-2020/access_03.log.gz
/tmp/archive/9-7-2020/error_03.log.gz
/tmp/archive/9-7-2020/error_04.log.gz
/tmp/archive/9-7-2020/error_05.log.gz
/tmp/archive/9-8-2020/error_01.log.gz
/tmp/archive/9-8-2020/error_02.log.gz
/tmp/archive/9-8-2020/error_03.log.gz
/tmp/archive/9-8-2020/error_04.log.gz
/tmp/archive/9-8-2020/error_05.log.gz
/tmp/archive/9-9-2020/access_01.log.gz
/tmp/archive/9-9-2020/access_02.log.gz
/tmp/archive/9-9-2020/access_03.log.gz
/tmp/archive/9-10-2020/error_04.log.gz
/tmp/archive/9-10-2020/error_05.log.gz

고쳐 쓰다:

Sort syntax:
sort -k4.7,4.11 -k4,5

/tmp/backup/7-12-2020/access_04.log
/tmp/backup/7-12-2020/error_02.log
/tmp/backup/7-12-2020/error_03.log
/tmp/backup/7-12-2020/error_04.log
/tmp/backup/7-12-2020/error_05.log
/tmp/backup/8-11-2020/access_01.log
/tmp/backup/8-11-2020/access_02.log
/tmp/backup/8-12-2020/error_01.log
/tmp/backup/8-12-2020/error_02.log
/tmp/backup/8-12-2020/error_03.log
/tmp/backup/8-12-2020/error_04.log
/tmp/backup/8-12-2020/error_05.log
/tmp/backup/9-11-2020/access_01.log
/tmp/backup/9-11-2020/access_02.log
/tmp/backup/9-11-2020/access_03.log
/tmp/backup/9-11-2020/access_04.log

답변1

이와 같은 특정 패턴의 경우 경로 이름을 별도의 /구성 요소 로 분할하여 -줄 시작 부분에 넣을 수 있습니다.

awk '{
    split($0, f, "[/-]");
    printf "%04d-%02d-%02d\t%s\t%s\n", f[6], f[5], f[4], f[7], $0
}'

그런 다음 그에 따라 날짜( yyyy-mm-dd)와 파일 이름(예: )을 access_NN.log.gz정렬합니다 .

sort

마지막으로 분류 구성요소를 벗겨냅니다.

cut -f3-

샘플 데이터가 파일에 있다고 가정하면 /tmp/logs다음과 같이 정리할 수 있습니다.

awk '{ split($0, f, "[/-]"); printf "%04d-%02d-%02d\t%s\t%s\n", f[6], f[5], f[4], f[7], $0 }' /tmp/logs |
    sort |
    cut -f3-

/tmp/archive/9-7-2020/access_01.log.gz
/tmp/archive/9-7-2020/access_02.log.gz
/tmp/archive/9-7-2020/access_03.log.gz
/tmp/archive/9-7-2020/error_03.log.gz
/tmp/archive/9-7-2020/error_04.log.gz
/tmp/archive/9-7-2020/error_05.log.gz
/tmp/archive/9-8-2020/error_01.log.gz
/tmp/archive/9-8-2020/error_02.log.gz
/tmp/archive/9-8-2020/error_03.log.gz
/tmp/archive/9-8-2020/error_04.log.gz
/tmp/archive/9-8-2020/error_05.log.gz
/tmp/archive/9-9-2020/access_01.log.gz
/tmp/archive/9-9-2020/access_02.log.gz
/tmp/archive/9-9-2020/access_03.log.gz
/tmp/archive/9-10-2020/error_04.log.gz
/tmp/archive/9-10-2020/error_05.log.gz

답변2

여기에서 모든 줄이 항상 /tmp/archive/같은 길이로 시작한다고 가정하면 다음과 같이 할 수 있습니다.

sort -t- -k3,3.4n -k1.14,1n -k2,2n -k3.5

여기서는 다음과 같이 단순화할 수 있습니다.

sort -t- -k3n -k1.14n -k2n -k3.5

어떤 로케일에서도 천 단위 구분 기호가 되지 않습니다 -(빼기 기호 문자이기도 하기 때문에). 따라서 flags 의 경우 n키 사양(예: -k1.14n첫 번째 줄에서 선택) 또는 (선택만)을 사용하면 됩니다.7-12-2020/access_04.log-k1.14,1n77 숫자.

관련 정보