bash에서 STDOUT을 변수로 읽는 방법은 무엇입니까?

bash에서 STDOUT을 변수로 읽는 방법은 무엇입니까?

나는 대역폭 사용량을 읽고 ifstat매초마다 다운로드 및 업로드를 인쇄합니다.STDOUT

ifstat -i wlp7s0
      wlp7s0      
 KB/s in  KB/s out
 1390.13     81.20
 1039.14     74.05
 1810.63    102.08
  865.60    183.15
 1272.91    274.19
 1174.00    400.04

bash 스크립트에서 명령을 실행하고 값이 특정 값보다 작은 경우 어떻게 ifstat값을 변수로 읽을 수 있습니까?if statement

예를 들어,

if [ $in -lt 100 ] && [ $out -lt 100 ]
then
   echo Network is slow.
else
   echo Network is fast.
fi

매초 확인하기 위해 출력을 변수 로 ifstat읽는 방법은 무엇입니까 ?$in$outif statement

답변1

네트워크 속도는 정수가 아니기 때문에 수치를 계산하려면 다른 도구(예: awk)로 이를 보완해야 합니다. 노력하다:

ifstat -ni wlp7s0 | awk 'NR>2{if ($1+0<100 && $2+0<100) print "Network is slow."; else print "Network is fast."}'

또는 여러 줄에 걸쳐 명령을 분산시키려는 경우:

ifstat -ni wlp7s0 | awk '
    NR>2{
        if ($1+0<100 && $2+0<100)
            print "Network is slow."
        else
            print "Network is fast."
    }'

어떻게 작동하나요?

이 옵션은 헤더 행의 주기적 반복을 억제하기 -n위해 추가되었습니다 .ifstat

NR>2{...}NR행 번호가 2보다 큰 경우에만 중괄호로 묶인 명령을 처리하도록 awk에 지시합니다. 이는 헤더 행을 건너뛰는 효과가 있습니다.

if ($1+0<100 && $2+0<100)첫 번째 필드 $와 두 번째 필드가 모두 $2100보다 작은지 테스트합니다. 미만이면 print "Network is slow."실행합니다. 그렇지 않은 경우 print "Network is fast."실행하십시오.

답변2

John1024는 부동 소수점 숫자에 대해서는 옳지만 숫자를 자를 수 있습니다. 일반 bash 사용:

n=0
LC_NUMERIC=C  ifstat -i $interface  \
| while read -r in out; do
  ((++n < 2)) && continue # skip the header
  if (( ${in%.*} < 100 && ${out%.*} < 100 )); then
    echo Network is slow.
  else
    echo Network is fast.
  fi
done

관련 정보