unix awk は文字列と一致し、区切りを実行します。

unix awk は文字列と一致し、区切りを実行します。

他のジャンプホストとのSSH経由でping通信を行うホストのping接続を確認しています。 awkを使用して成功したパケットのping回数を印刷したいと思います。

xajvtl001:/home/root #ssh -qn xckvl002"ping -w2 -c3 xcvtc012| grep packets"
3 packets transmitted, 3 packets received, 0% packet loss

受信したパケット数に基づいて予想される出力値は3です。

答え1

GNU grepがある場合:grep -oP '\d+(?= packets received)'

「受信したパケット」の後の数字を見つけます。

答え2

受信したパケット数を探している場合:

ssh -qn xckvl002 "ping -w2 -c3 xcvtc012 | awk '/packets transmitted,/ {print \$4}'"

リモートコマンドの周囲に二重引用符を使用しているため、内部一重引用符は直接引用符の意味を失うため、このような文字は$まだエスケープする必要があります。これがバックスラッシュがで使用される理由ですprint \$4

の実装はping異なる出力を持つことができます。私の場合はN packets receivedそうですReceived = N。検索パターン(例ではawkスラッシュで囲まれている)が要約行を正しく識別していることを確認することをお勧めします。また、出力にスペースで区切られたフィールド数が異なる場合は、フィールド変数に$44以外の数字を使用する必要があります。

sed編集:興味のある人のためのソリューション:

ssh -qn xckvl002 "ping -w2 -c3 xcvtc012 | sed -nr 's/.*([0-9]+)\s*received,.*/\1/p'"

答え3

次のコマンドを使用しました。

# ping -c3 hostname|awk '/received/{print $0}'| awk -F "," '{print $2}'|sed -r "s/^\s+//g"| awk '{print $1}`

出力は次のとおりです

3

関連情報