シェルスクリプトは生成されたファイルをawkできません。

シェルスクリプトは生成されたファイルをawkできません。

いくつかの簡単な合格/失敗テストスクリプトを作成しようとしていますが、以下に説明するようにいくつかの問題に直面しています。私の意図は、問題が検出されたときに発生するさまざまなスキャンを実行するためにファイルを解析しながら、コマンド(results.txtpingなど)の結果全体をファイルに保存することです。results.txt

#!/bin/bash
ping -c 20 google.com > results.txt
packetloss = `awk '/packet loss/{x=$6} END{print x}' results.txt`
echo "$packetloss" >> debug.txt
#  if packetloss > 0, add to an error.txt to fail
#  if avg ping time > 5ms, add to an error.txt to fail

packetloss変数を取得できませんでしたawkファイルの情報results.txt(表示用にデバッグファイルに送信されます)シェルスクリプトに、この問題と関連する回避策を防ぐことができるものがあるかどうか疑問に思います。

手動で実行すると、予想される「0%」awkが返されます。results.txt

答え1

周囲のスペースは許可されていません=

だから:

#!/bin/bash
ping -c 20 google.com > results.txt
packetloss=$(awk '/packet loss/{print $6}' results.txt)
echo "$packetloss" >> debug.txt

またはより短く:

ping -c 20 google.com |
    awk '/packet loss/{sub(/%/, "");print $6 >> "debug.txt"}'

メモ:

  • x変数に値を割り当てる必要はなく、$6直接印刷できます。
  • AWK自体は出力として新しいファイルを生成できます。
  • バックティック
    `
    次のような古いスタイルのコマンドの置き換えに使用されます。
foo = `コマンド`

foo=$(command)代わりにこの構文を使用することをお勧めします。内部バックスラッシュ処理は$()驚くべきことではなく、$()入れ子にするのが簡単です。

確認するhttp://mywiki.wooledge.org/BashFAQ/082

使用する追加ソリューション真珠:

ping -c 20 google.com |
    perl -lne '/(\d+)%\s+packet\s+loss/ and print $1' >> debug.txt

答え2

#!/usr/bin/perl
my $host=shift or die("Usage $0 host\n");

open(PING , "-|", "ping -c 20 $host") or die;
open(DEBUG, ">>", "debug.txt"       ) or die; 

while(<PING>){
  if(m!(\d+)% packet loss!     ){ $Lost=$1 }
  if(m!rtt.*= (.+?)/(.+?)/(.+)!){ $Avg=$2  }
}

if   ( $Lost > 0 ) { print DEBUG "not ok: lost pcks ($Lost%)\n"    }
elsif( $Avg  > 5 ) { print DEBUG "not ok: too slow  ($Avg)\n"      }
else               { print DEBUG "ok: ping\n"                      }

関連情報