[완료] [질문] perl - vmstat 결과의 평균 (array의 칼럼별 평균)
안녕하세요.
vmstat 의 결과가 보통 아래와 같은 형식으로 나옵니다.
procs memory page faults cpu
r b avm free re pi po fr sr cy in sy cs us sy wa id
8 0 26 12 0 0 0 0 0 0 12614 294612 53600 32 8 22 38
5 0 26 12 0 0 0 0 0 0 14542 259303 47595 37 8 26 29
6 0 26 12 0 0 0 0 0 0 12291 164999 49580 36 7 25 31
4 0 26 12 0 0 0 0 0 0 10830 151400 42955 28 6 19 47
6 0 26 12 0 0 0 0 0 0 12799 118963 44968 34 7 28 32
이 결과를 string으로 받아서
행렬 계산하듯이 하면 각 항목별 평균을 구할 수 있는데
혹시 보다 쉬운 방법으로 각 항목별 평균을 구하는 방법이 있으면 알려주세요.
$ret = `vmstat 1 6 | tail -5 ` ;
감사합니다.
일반적인 방법
일반적인 방법
결과
질문이 있습니다. my
먼저 답변에 감사드립니다.
질문이 있습니다.
my @average = map { $_ / $row_cnt } @sum;
구문에 대해서 설명을 부탁드려도 될까요?
그리고 vmstat 결과를 string 변수에 담아서 처리하므로
아래와 같이 구현했습니다.
# 평균을 구한다.
$row_cnt = 0 ;
# $ret = `vmstat 1 $vmstat_cnt | tail -($vmstat_cnt -1) ` ;
$ret = " 8 0 26 12 0 0 0 0 0 0 12614 294612 53600 32 8 22 38
5 0 26 12 0 0 0 0 0 0 14542 259303 47595 37 8 26 29
6 0 26 12 0 0 0 0 0 0 12291 164999 49580 36 7 25 31
4 0 26 12 0 0 0 0 0 0 10830 151400 42955 28 6 19 47
6 0 26 12 0 0 0 0 0 0 12799 118963 44968 34 7 28 32" ;
@vm_sum = "" ;
@vmstats = "" ;
foreach $line ( split /\n/, $ret ) {
$line =~ s/^\s*//g ;
# chomp($line) ;
$col_cnt = 0;
foreach $value ( split /\s+/, $line ) {
# @vmstats = split / +/, $line ;
$vm_sum[$col_cnt] += $value ;
$col_cnt++;
}
$row_cnt++;
}
@vmstats = map { $_ / $row_cnt } @vm_sum ;
print "row_cnt : ", "$row_cnt\n";
print "col_cnt : ", "$col_cnt\n";
print "@vm_sum\n";
print "@vmstats\n";
my @average = map { $_ / $row_cnt } @sum; 는
my @average = map { $_ / $row_cnt } @sum; 에서
우선 map 함수의 용도는 http://perldoc.perl.org/functions/map.html 을 보시면 되며
map은 함수형언어의 특징을 가져온 것이죠.
map은 다음과 같은 두가지 형태로 쓸 수 있으며
1. map 표현식,리스트
my @a = map $_*2, (1,2,3,4);
#@a는 (2,4,6,8)
2. map 블럭 리스트 (,가 없음을 주의, 블럭안에는 구문(statement)가 올 수 있다.)
my @b = (2,4,6,8)
my @a = map { $_/2 } @b;
#@a는 (1,2,3,4)
뒤의 리스트에서 하나씩 가져와서 표현식 혹은 블럭의 결과를 적용한 결과를 다시 리스트로 리턴합니다.
perl의 grep함수도 map이랑 비슷한 성격의 함수죠.
my @average = map { $_ / $row_cnt } @sum;
를 foreach를 사용해서 바꿔보면
처럼 되겠죠.
친절한 설명 정말
친절한 설명 정말 감사드립니다.
최종적으로 아래와 같이 만들었습니다. (제 목적은 완료했습니다.)
혹시 시간이 되시면 보시고 추가적인 조언 부탁드립니다. ^^
반칙인것같긴 한데...
죄송...
댓글 달기