저는 특정 디렉터리에 있는 모든 사용자의 디스크 사용량을 분석하기 위해 스크립트 tcsh
(예...알지만 그래야 합니다)를 작성 중입니다.
마지막으로 다음 형식으로 보고서를 생성하고 싶습니다.
user1 1.6GB
user2 1.1GB
..
user69 10MB
먼저 나는 달린다
find . -printf "%u %s\n" | awk '{user[$1]+=$2}; END{ for( i in user) print i " " user[i]}' > example.tmp
그런 다음 다음을 통해 두 번째 열을 사람이 읽을 수 있는 크기로 변환했습니다.
awk '{ print $2 }' example.tmp | numfmt --to=iec-i --suffix=B --padding=7
하지만 이전 열이 있던 위치로 다시 병합할 수는 없습니다. 합계 numfmt
에 명령을 직접 삽입하는 방법이 있나요 ?awk
저는 "awk" 명령이 좀 약한 편이라 부족한 코드를 용서해주세요.
답변1
형식을 두 번째 필드로만 직접 제한하는 옵션을 사용하면 --field
이 작업을 피할 수 있습니다.numfmt
find . -printf "%u %s\n" |
awk '{user[$1]+=$2}; END{ for(i in user) print i, user[i]}' |
numfmt --field=2 --to=iec-i --suffix=B --padding=7
awk에서 특정 값을 적용해야 하는 경우 numfmt
간단한 경우에 작동하지만 필요하지 않은 변형은 다음과 같습니다 getline var
.
find . -printf "%u %s\n" |
awk '
{user[$1]+=$2}
END {
cmd = "numfmt --to=iec-i --suffix=B --padding=7";
for(i in user){ printf "%s ", i; print user[i] | cmd; close(cmd) }
}
'
답변2
예를 들어, numfmt
내에서 명령을 호출하여 이 작업을 수행 할 수 있습니다 .awk
awk '{cmd=sprintf("numfmt --to=iec-i --suffix=B --padding=7 %d",$2); cmd | getline converted; close(cmd); print $1,converted}' example.tmp
이 방법으로 첫 번째 호출 awk
에서 직접 구현할 수도 있습니다.
find . -printf "%u %s\n" | awk '{user[$1]+=$2};
END{
for(i in user) {
cmd=sprintf("numfmt --to=iec-i --suffix=B %d",user[i]);
cmd | getline converted;
close(cmd);
printf("%s % 7s\n",i,converted)
}
}'
답변3
테스트를 거쳐 잘 작동함
#!/usr/bin/python
import os
import subprocess
from os import *
users=[]
for i,j,k in os.walk('<directory>'):
for m in k:
fil=str(i)+str(m)
if os.path.isfile(fil):
if os.stat(fil).st_uid not in users:
users.append(os.stat(fil).st_uid)
for u in users:
size=0
for i,j,k in os.walk('<Directory>'):
for z in k:
fil=str(i)+str(z)
if os.path.isfile(fil):
if (os.stat(fil).st_uid == u):
size=os.stat(fil).st_size+size
cmd1="getent passwd {0}".format(u)
ou1=subprocess.Popen(cmd1,stdout=subprocess.PIPE,shell=True).communicate()[0].strip().split(':')[0]
print size,ou1
~
~