쉘 소스 분석좀 부탁드리겠습니다 ^^

slayermen의 이미지

#!/bin/bash

CUID=500
CHECK=`cat /etc/passwd | sed -e 's/::/:nothing:/g' | sed -e 's/ //g' | sed -e 's
/:/ /g' | awk '{print $6}'`

if [ "$CHECK" != "" ];
then
for i in $CHECK;
do
UIDS=`cat /etc/passwd | grep $i | sed -e 's/::/:nothing:/g' | sed -e 's/
//g' | sed -e 's/:/ /g' | awk '{print $3}'`
UIDS=`echo $UIDS | sed -e 's/ /00000000/g'`
if [ "$UIDS" -ge "$CUID" ] && [ "$UIDS" -lt 1000000 ]; then
du -sh $i >> /tmp/du_result.txt
fi
done
echo "space bar를 누르면 다음페이지를, q를 누르면 종료가 됩니다."
echo ""
cat /tmp/du_result.txt | sed -e 's/\/home\///g' | less
#rm -rf /tmp/du_result.txt
fi

코드는 위와 같습니다.. 시스템관리자로서 사용자별로 어느정도의 용량을 사용하고 있는지
체크하는 프로그램인데 ㅡ 가독이 너무 힘들군요..
한줄한줄 어떤식으로 이루어진 프로그램인지 가독좀 부탁드립니다 ^^

JuEUS-U의 이미지

#!/bin/bash
 
CUID=500
CHECK=`홈 디렉토리를 구한다.`
 
if [ "$CHECK" != "" ]; then # 있으면
    for i in $CHECK; do
        UIDS=`유저 아이디(UID)를 구한다`
        UIDS=`echo $UIDS | sed -e 's/ /00000000/g'` # ?? 공백을 00~ 로 변환
 
        if [ "$UIDS" -ge "$CUID" ] && [ "$UIDS" -lt 1000000 ]; then# CUID ~ 1000000 사이인가?
            du -sh $i >> /tmp/du_result.txt # Disk Usage ( summarize, human readable )
        fi
    done
 
    echo "space bar를 누르면 다음페이지를, q를 누르면 종료가 됩니다."
    echo ""
    cat /tmp/du_result.txt | sed -e 's/\/home\///g' | less # 임시 보관한 결과물 출력
fi

이해가 안가는 부분이, 유저 아이디를 구할 때 awk print를 했기 때문에 어차피 공백이 없지 않나요?;
지금 윈도우라 확인이 안되네요 '~';;;

houyhn의 이미지

1. /etc/passwd 파일 각 줄의 6번째 필드(각 사용자의 홈디렉토리 path)를 뽑아서 나열하여 CHECK 변수에 저장한다.
2. CHECK 변수가 빈 문자열이 아니면, CHECK 변수에 나열된 홈디렉토리를 사용하는 UID들(/etc/passwd 파일 각 줄의 3번째 필드들)을 알아내어 UIDS 변수에 저장한다.
3. UIDS의 값이 500 이상이면 그 홈디렉토리의 용량을 체크하여 /tmp/du_result.txt에 저장한다.
4. CHECK 변수에 나열된 홈디렉토리 각각에 대해 모두 다 용량 체크한 후, 결과를 한꺼번에 출력한다.

근데 썩 잘짜인 로직이 아닌것 같네요. 저라면 약간 달리 접근해서 짜겠습니다. 기왕이면 perl이나 python을 써서.

--
http://dongsupark.de/

다즐링의 이미지

뭐 대충 만들어봤어요 -_-;;

import sys , os
userlist = map( lambda x : [ x.split(":")[0] , int(x.split(":")[2]) , x.split(":")[5]] , open("/etc/passwd","r").readlines())
for x in userlist:
	if x[1] > 500 and x[1] < 1000000:
		print x[0] + " " + os.popen("du -sh %s" % x[2]).read()

-------------------------------------------------------------------------------------------------------
Life ... http://iz4u.net/blog/

------------------------------------------------------------------------------------------------
Life is in 다즐링

aero의 이미지

저도 간단한 것들은 shell script를 쓰기도 하지만...
위에서 처럼 저렇게 shell 스크립트에서 외부명령의 결과를 가지고 조작을 해야할 일이 많으면
그냥 Perl 씁니다.

perl -n -e '@u=(split/:/)[0,2,5];print "$u[0] ",qx/du -sh $u[2]/,"\n" if $u[1]>500 and $u[1]<1000000' /etc/passwd