[완료] 명령수행결과 (표준출력/오류)의 매 라인을 while 문 등에서 처리하려면?

yundorri의 이미지

명령수행결과 (표준출력/오류)의 매 라인을 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

slc1의 이미지

ls -ltr | awk 'NF >= 8 { SUM+=$5 } END { print SUM/1024 "kb" }'

익명사용자의 이미지

감사합니다.

그런데 ls-ltr이라는 결과가 매번 달라지쟎아요.그렇다면

LEN=$(ls -ltr | wc -l)
TOTALSIZE=$(ls -ltr | awk 'NF >= $LEN { SUM+=$5 } END { print SUM/1024 "kb" }')

와 같이 하면 될까요? 저는 잘 안되는것 같습니다.
저는 fedora6에 bash를 사용하고 있습니다.
도움 부탁드립니다.

yundorri의 이미지

그런데, NF >= 8 에서 8이란게 항상 달라지지 않을까요?
그러면 어떻게 해야되나요?

ls -ltr의 출력 라인수를 읽어와서 8 대신에 넣어야 할 것 같은데,

LINECNT=ls -ltr | wc -l
TOTALSIZE=$(ls -ltr | awk 'NF >= $LINECNT { SUM+=$5 } END { print SUM/1024 "kb" }')

라고 하면 될까요? 해 봤더니 저는 잘 안되네요.
저는 Fedora 6에서 bash 사용하고 있습니다.

slc1의 이미지

NF는 필드 수입니다..
필드가 8이상이면.. 수행되는거죠..
있어도 되고, 없어도 되는데.. 간혹.. 필드수가 모자라면,, 에러가
나는 awk들이 있어서..

에러 방지용으로 넣은 겁니다..

없어도 되지만,, 있어서 문제될건 없으니까요..

fox9의 이미지

for LINE in `ls -ltr`;
do
      FILESIZE=$(echo $LINE | awk '{ print $5 }')
      TOTALSIZE=$(($TOTALSIZE+$FILESIZE))
done
 
echo "total size="$TOTALSIZE

위의 것을 물어보시는 건가요?

실행결과를 for로 넘기고 싶으면 `실행내용` 으로 하면 되는데, 질문이 이게 맞는지를 잘 모르겠네요

Prentice의 이미지

``를 사용하면 스페이스 단위로 분리가 되지 않나요..? 줄 별로 분리를 원하신다면 아마 다른 방법을 쓰셔야 할 것 같습니다.

Prentice의 이미지

ls -ltr | awk '{ sum=sum+$5; printf("%d\n", sum) }' | tail -1

yundorri의 이미지

제가 든 예제는 제가 궁금한것을 간략하게 보여드리기 위함이었습니다.
이제 실토를 해야겠군요... ^_^;

사실은, 현재 Login 되어있는 사용자들을 하나의 줄로 표현되게 하고 싶었습니다.

[yundorri@swdev0 trash]$ w
 15:03:39 up 179 days,  5:09,  9 users,  load average: 0.06, 0.10, 0.03
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
koomung  pts/1    swdev3           Thu15    3:30m  0.15s  0.15s -bash
yundorri pts/3    swdev2           Thu11    1:41m  0.33s  0.16s vim systemloadr
koomung  pts/4    swdev3           Thu16    3:28m  0.06s  0.03s vim gpib_0228_3
usernet  pts/10   Kim-Kil-Dong     13:21    1:41m  0.01s  0.01s -bash
[yundorri@swdev0 trash]$     

여기서 두 번째 이하의 줄만 모아서 다음과 같이 출력하고 싶었습니다.
4 People(s): koomung[swdev3], yundorri[swdev3], koomung[swdev3], usernet[Kim-Kil-Dong]

이럴려면, w의 결과를 저장해 놓고 각 라인별로 awk를 사용해야 되는데요, 로그인한 사용자는
매 번 달라지기 때문에 awk를 사용하는 횟수도 달라져야 겠지요.
그리고 가능하면 w는 한 번만 실행해야돼서 (시스템에 load가 되면 안돼서) 저장결과를
변수에 저장했습니다.

#!/bin/bash
W_RESULT=$(/usr/bin/w)
USERS=$(echo $W_RESULT | awk '{ print $6 }')
echo -n "$USERS People(s): "
 
VAR=2
while [ "$VAR" -lt "$USERS" ];
do
     VAR=$(($VAR+1))
     LINESTR=$(echo "$W_RESULT" | head -$VAR | tail -n1)
     CON_USER=$(echo $LINESTR | awk '{ print $1"["$3"]" }')
     USER_LISTS=$USER_LISTS" $CON_USER,"
done
echo $USER_LISTS
exit 0

이 코드가 마음에 들지 않는겁니다. 일단, head와 tail 두 tool을 사용한 것도 그렇고
왠지 어거지로 한것 같습니다.
예로 든 코드가 너무 허접했습니다. 너그러이 이해해 주십시요...
간단명료하게 만들어주실분 안 계시나요.???

fox9 님의 말씀대로 해 봤는데 잘 안되는군요.

slc1의 이미지

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 "" }'

slc1의 이미지

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 ""
}'

yundorri의 이미지

굉.!! 굉장하군요.
awk에 이런 기능이 있을 줄 이야 . . . .
덕분에 좋은 정보 배웟습니다. 고맙습니다.

서지원의 이미지

좀 지저분하게 보일수도 있지만...

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쓴게 더 짧은거 같네요.

yundorri의 이미지

한수 갈켜주신 고수님들께 감사드립니다.

제게는 mkfifo와 awk에 대해 알게된 계기였습니다.
많은 유익한 정보 얻고 갑니다. 감사합니다.

pung96의 이미지

w -h 옵션을 쓰시면 좀더 간단하게 만드실 수 있습니다.

perl -le 'print join ", ",map { ($u,$f)=(split)[0,2]; "$u\[$f\]" } `w -h`;'

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.