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)最初のフィールド$と2番目のフィールドの両方が$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

関連情報