[완료] 명령수행결과 (표준출력/오류)의 매 라인을 while 문 등에서 처리하려면?
글쓴이: yundorri / 작성시간: 금, 2007/03/16 - 1:08오후
명령수행결과 (표준출력/오류)의 매 라인을 while 문 등에서 처리하려면 어떻게 해야될까요?
예를들어, 현재 디렉토리의 파일리스트의 크기의 총합을 구하려고 한다면..
ls -ltr lrwxrwxrwx 1 yundorri yundorri 16 Sep 29 10:28 log -> /home/ulssys/log lrwxrwxrwx 1 yundorri yundorri 20 Sep 29 10:29 src -> /home/ulssys/sources lrwxrwxrwx 1 yundorri yundorri 26 Jan 16 10:05 simaxcheck -> src/bin-source/simaxcheck/ drwxrwxr-x 2 yundorri yundorri 4096 Mar 13 17:29 bin -rw-rw-r-- 1 yundorri yundorri 427 Mar 15 11:40 monitoring -rwxrwxr-x 1 yundorri yundorri 6200 Mar 16 11:01 systemloadrev drwxrwxr-x 2 yundorri yundorri 4096 Mar 16 12:02 trash
이렇게 나옵니다. 이 결과의 매 라인을
for LINE in [ls -ltr 의 수행결과]; do FILESIZE=$(echo $LINE | awk '{ print $5 }') TOTALSIZE=$(($TOTALSIZE+$FILESIZE)) done echo "total size="$TOTALSIZE
처럼 사용할 수 있을까요? 아니면 다른 방법을...
도저히 표현능력의 한계를 절감하면서 부디 고수님들이 이해하셨기만을 바랍니다. T_T
Forums:
이건어떨지..
ls -ltr | awk 'NF >= 8 { SUM+=$5 } END { print SUM/1024 "kb" }'
감사합니다. 그런데
감사합니다.
그런데 ls-ltr이라는 결과가 매번 달라지쟎아요.그렇다면
와 같이 하면 될까요? 저는 잘 안되는것 같습니다.
저는 fedora6에 bash를 사용하고 있습니다.
도움 부탁드립니다.
그런데, NF >= 8 에서
그런데, NF >= 8 에서 8이란게 항상 달라지지 않을까요?
그러면 어떻게 해야되나요?
ls -ltr의 출력 라인수를 읽어와서 8 대신에 넣어야 할 것 같은데,
라고 하면 될까요? 해 봤더니 저는 잘 안되네요.
저는 Fedora 6에서 bash 사용하고 있습니다.
NF는
NF는 필드 수입니다..
필드가 8이상이면.. 수행되는거죠..
있어도 되고, 없어도 되는데.. 간혹.. 필드수가 모자라면,, 에러가
나는 awk들이 있어서..
에러 방지용으로 넣은 겁니다..
없어도 되지만,, 있어서 문제될건 없으니까요..
``를 물어보시는 것인가요?
위의 것을 물어보시는 건가요?
실행결과를 for로 넘기고 싶으면 `실행내용` 으로 하면 되는데, 질문이 이게 맞는지를 잘 모르겠네요
``를 사용하면
``를 사용하면 스페이스 단위로 분리가 되지 않나요..? 줄 별로 분리를 원하신다면 아마 다른 방법을 쓰셔야 할 것 같습니다.
ls, awk, tail
ls -ltr | awk '{ sum=sum+$5; printf("%d\n", sum) }' | tail -1
죄송합니다. 사실은..
제가 든 예제는 제가 궁금한것을 간략하게 보여드리기 위함이었습니다.
이제 실토를 해야겠군요... ^_^;
사실은, 현재 Login 되어있는 사용자들을 하나의 줄로 표현되게 하고 싶었습니다.
여기서 두 번째 이하의 줄만 모아서 다음과 같이 출력하고 싶었습니다.
4 People(s): koomung[swdev3], yundorri[swdev3], koomung[swdev3], usernet[Kim-Kil-Dong]
이럴려면, w의 결과를 저장해 놓고 각 라인별로 awk를 사용해야 되는데요, 로그인한 사용자는
매 번 달라지기 때문에 awk를 사용하는 횟수도 달라져야 겠지요.
그리고 가능하면 w는 한 번만 실행해야돼서 (시스템에 load가 되면 안돼서) 저장결과를
변수에 저장했습니다.
이 코드가 마음에 들지 않는겁니다. 일단, head와 tail 두 tool을 사용한 것도 그렇고
왠지 어거지로 한것 같습니다.
예로 든 코드가 너무 허접했습니다. 너그러이 이해해 주십시요...
간단명료하게 만들어주실분 안 계시나요.???
fox9 님의 말씀대로 해 봤는데 잘 안되는군요.
w | awk 'BEGIN { IDX=0 }
w | awk 'BEGIN { IDX=0 } NR > 2 {IDX++;USER[IDX]=$1;FROM[IDX]=$3} END { printf "%d people(s) ",IDX for(ix=1;ix<=IDX;ix++) printf "%s[%s] ",USER[ix], FROM[ix] print "" }'
w | awk 'BEGIN { IDX=0 }
w | awk 'BEGIN { IDX=0 }
NR > 2 {IDX++;USER[IDX]=$1;FROM[IDX]=$3}
END { printf "%d people(s) ",IDX
for(ix=1;ix<=IDX;ix++) printf "%s[%s] ",USER[ix], FROM[ix]
print ""
}'
굉.!! 굉장하군요.
굉.!! 굉장하군요.
awk에 이런 기능이 있을 줄 이야 . . . .
덕분에 좋은 정보 배웟습니다. 고맙습니다.
One Liner
좀 지저분하게 보일수도 있지만...
mkfifo pipe1 ; mkfifo pipe2; ((cat pipe2| xargs printf "%d people\n" $1 ) & ); ((wc -l < pipe1 > pipe2 ) & ); ( w -h|awk '{print $1 " " $3}' |tee pipe1 ) ; rm pipe1; rm pipe2;
근데 위에 awk쓴게 더 짧은거 같네요.
한수 갈켜주신
한수 갈켜주신 고수님들께 감사드립니다.
제게는 mkfifo와 awk에 대해 알게된 계기였습니다.
많은 유익한 정보 얻고 갑니다. 감사합니다.
w -h 옵션을 쓰시면
w -h 옵션을 쓰시면 좀더 간단하게 만드실 수 있습니다.
댓글 달기