Shell-Skript kann erstellte Datei nicht awk


7

Ich versuche, einige einfache Pass / Fail-Testskripte zu erstellen, habe aber einige Herausforderungen, wie unten beschrieben. Meine Absicht ist es, die vollständigen Ergebnisse eines Befehls (z. B. Ping) in eine zu results.txtspeichernde Datei zu übertragen, aber auch die results.txtDatei zu analysieren , um verschiedene Überprüfungen durchzuführen, wenn Probleme festgestellt werden:

#!/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

Die Paketverlustvariable ruft die awkInformationen nicht aus der results.txtDatei ab (Senden an eine Debug-Datei zur Überprüfung). Ich habe mich gefragt, ob es etwas an Shell-Skripten gibt, das dies und eine damit verbundene Problemumgehung verhindert.

Manuelles Ausführen awkmit results.txt'0%' ergibt das erwartete Ergebnis.

Antworten:


11

Leerzeichen sind nicht erlaubt =!

Damit:

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

Oder noch kürzer:

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

HINWEIS:

  • Die xVariable muss nicht zugewiesen werden. Sie können $6direkt drucken .
  • AWK selbst kann mit seiner Ausgabe neue Dateien erstellen
  • Das Backquote
    `
    wird bei der Befehlssubstitution im alten Stil verwendet, zum Beispiel:
foo = `Befehl`

foo=$(command)Stattdessen wird die Syntax empfohlen. Die Handhabung von Backslash im Inneren $()ist weniger überraschend und $()einfacher zu verschachteln.

Überprüfen Sie http://mywiki.wooledge.org/BashFAQ/082

Zusätzliche Lösung mit Perl :

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

1
Bingo - das muss das Hauptproblem bei kompilierten Sprachprogrammierern sein, die versuchen, Skripte zu schreiben :-P
Dhartford

Gibt es eine Möglichkeit, awk zu verwenden, um niemals '%' oder ähnliche Zeichen anzuzeigen?
Dhartford

Ja, POST entsprechend bearbeitet, überprüfen Siesub()
Gilles Quenot

1
#!/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"                      }

Globale Dateihandles sollten vermieden werden. Verwenden Sie stattdessen:open my $debug, ">>", "debug.txt" or die $!;
Gilles Quenot

@sputnick: danke. Du hast recht oder natürlich. Ich habe nur versucht, es einfacher aussehen zu lassen ... (immer eine gefährliche Wahl) :)
JJoao
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.