AWK - 특정 달에 생성된 모든 파일의 수량과 무게를 나열하는 스크립트 [닫기]

AWK - 특정 달에 생성된 모든 파일의 수량과 무게를 나열하는 스크립트 [닫기]

모든 달에 대해 "/home" 디렉터리에 있는 모든 파일과 해당 가중치를 계산하고 목록을 터미널에 표시하는 스크립트를 AWK에 작성해야 합니다. 출력은 다음과 같아야 합니다.

여기에 이미지 설명을 입력하세요.

답변1

ls나는 시스템 명령을 사용하여 파일을 나열하고 stat그에 대한 정보를 얻는 스크립트를 awk에 작성했습니다 . 그러면 스크립트는 파일 번호와 크기를 바이트 단위로 인쇄합니다.

#!/usr/bin/awk -f


BEGIN {
    dir = "/home/matej"   #chnage default directory

    if(ARGC == 2){   #check for command line arguments
        dir = ARGV[1]
    }
    printf("Listing directory: %s\n", dir)


    cmd = "ls " dir

    m_names[1] = "January"
    m_names[2] = "February"
    m_names[3] = "March"
    m_names[4] = "April"
    m_names[5] = "May"
    m_names[6] = "June"
    m_names[7] = "July"
    m_names[8] = "August"
    m_names[9] = "September"
    m_names[10] = "October"
    m_names[11] = "November"
    m_names[12] = "December"


    while((cmd | getline filename) > 0 ){
        "stat --printf=\"%Y %s\" \"" dir "/" filename "\"" | getline info   #use %W instead of %Y if your system supports date of birth
        #FS = " "
        split(info, arr, " ")
        time = arr[1]
        size = arr[2]

        month = strftime("%m", time) + 0   #+ 0 is for converting string to int and removein first 0

        months[month] = months[month] + 1
        sizes[month] = sizes[month] + size
    } 
    close(cmd)

    #pretty print
    printf("%-11s %-20.18s %s\n", "Month", "Number of files", "Total size of files (in bytes)")
    for(a = 1; a <= 12; a ++){
        printf("%-9s:   %-20s %s\n", m_names[a], months[a], sizes[a])
    }

}

이 스크립트에서 두 가지를 수정합니다.

  • dir = "/home/matej/"기본 디렉터리 변경
  • "stat --printf=\"%Y %s\" \"" dir filename "\"" | getline info시스템이 출생 시간을 지원하는 경우 %Y 대신 %W를 사용하세요.

스크립트를 실행합니다:

  • chmod +x script.awk
  • ./script.awk또는 논쟁./script.awk /home/user

내 시스템의 출력은 다음과 같습니다.

Listing directory: /home/matej
month       number of files      total size of files
January  :   7                    163860
February :   1                    4096
March    :   1                    4096
April    :   1                    764
May      :   1                    4096
June     :   3                    12288
July     :   2                    13142852623
August   :   2                    8192
September:   1                    16
October  :   8                    10975459334
November :   4                    44067
December :   10                   49152

관련 정보