awk: 날짜별로 가장 오래된 파일과 최신 파일 찾기

awk: 날짜별로 가장 오래된 파일과 최신 파일 찾기

나는 awk script날짜(6번째, 7번째, 8번째 필드)를 기준으로 생성된 가장 오래되고 최신 파일을 인쇄하는 데 사용하고 있습니다.
내 샘플 목록의 날짜 형식은 (YYYY/MM/DD)입니다.

file was created 2020/10/10 20:18:42 its name is output1
file was created on 2020/09/10 12:13:22 its name is foobar.awk
file was created on 2020/10/10 20:12:43 its name is output2
file was created on 2020/12/10 18:11:38 its name is foobar.bash
file was created on 2020/12/10 22:32:13 its name is output.txt

다음과 같아야 합니다.

Oldest file date :
2020/09/10 12:13:22
file name: foobar.awk

Newest file date :
2020/12/10 22:32:13
file name: output,txt

awk참고: "가장 오래된 파일과 최신 파일만 인쇄하고 싶습니다" 만 사용할 수 있습니다 .
또한: 파일을 정렬하지 않고 단순히 가장 오래된 파일과 최신 파일만 인쇄합니다.

답변1

GNU awk를 가정하면:

gawk '
    {created[$NF] = $5 " " $6}
    END {
        PROCINFO["sorted_in"] = "@val_str_asc"
        for (f in created) {print "oldest:", f, created[f]; break}
        PROCINFO["sorted_in"] = "@val_str_desc"
        for (f in created) {print "newest:", f, created[f]; break}
    }
' file

인용하다:배열 순회 제어, 그리고gawk를 통해 사전 정의된 배열 스캔 순서 사용

답변2

stat파일 및 수정 시간을 가져오는 데 사용되며 awk출력을 정렬 및 형식화하지 않고 최소/최대를 가져옵니다.

stat -c "%Y %n" * | awk '
    min == "" || min > $1 {min = $1; fmin = substr($0, index($0, FS)+1)}
    max == "" || max < $1 {max = $1; fmax = substr($0, index($0, FS)+1)}
    END {
        form = "%Y/%m/%d %H:%M:%S"
        printf "Oldest\nDate: %s\nFile: %s\n", strftime(form, min), fmin
        printf "Newest\nDate: %s\nFile: %s\n", strftime(form, max), fmax
    }'

예제 출력:

Oldest
Date: 2020/08/29 01:52:23
File: test.java
Newest
Date: 2020/10/12 06:52:21
File: test.sh

노트:

  • 위의 코드는 줄 바꿈이 아닌 파일의 공백을 처리합니다.
  • 내 생각에 awk strftime은 GNU에만 해당되는 것 같습니다.

관련 정보