Einzelnen Beitrag anzeigen

Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#9

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 31. Dez 2010, 18:22
Unter diversen *nixen kann man auch in /proc/ haufenweise Infos finden, aber das scheint's bei unserm Mac mini zumindest nicht zu geben.

Hier ein paar nützliche Grundlagen vor dem Lesen eines Bash-Skriptes (Wildcards in "pattern" ist jeweils erlaubt):
  • ${variable##pattern} löscht den längsten Treffer vom Anfang des Strings in "variable"
  • ${variable#pattern} löscht den kürzesten Treffer vom Anfang des Strings in "variable"
  • ${variable%%pattern} löscht den längsten Treffer vom Ende des Strings in "variable"
  • ${variable%pattern} löscht den kürzesten Treffer vom Ende des Strings in "variable"
  • ${variable//pattern/replacement} ersetzt den Treffer im String in "variable" durch "replacement"
  • (()) und $(()) ist für arithmetische Ausdrücke
  • while AUSDRUCK; do BEFEHLE; done
  • for VARIABLE in SEQUENZ; do BEFEHLE; done
    Achtung: gerade hier wird (lt. Standardverhalten) nach Leerzeichen getrennt. Mehrere Zeilen werden also nicht zeilenweise sondern "wortweise" durchlaufen. Ansonsten:
  • ZEILENWEISE_AUSGABE|while read VARIABLE; do BEFEHLE; done
  • Klassisches Shellskript:
    if [ AUSDRUCK ]; then BEFEHLE; else BEFEHLE; fi
    if [ AUSDRUCK ]; then BEFEHLE; fi
    oder "bashiger":
    if [[ AUSDRUCK ]]; then BEFEHLE; else BEFEHLE; fi
    if [[ AUSDRUCK ]]; then BEFEHLE; fi
    wobei letztere komplexere Ausdrücke erlauben. Auch:
    if (( AUSDRUCK )); then BEFEHLE; else BEFEHLE; fi
  • (BEFEHL|BEFEHL|BEFEHL) startet die Befehle in einer Subshell, womit sie einen gemeinsamen Exitcode bekommen.
  • [[ AUSDRUCK ]] && BEFEHL
    ... ist kurz für:
    if [[ AUSDRUCK ]]; then BEFEHLE; fi
    Auch negiert:
    [[ AUSDRUCK ]] || BEFEHL
    Mit Subshell:
    [[ AUSDRUCK ]] && (BEFEHL;BEFEHL)
    Ohne Subshell (mehrere Befehle):
    [[ AUSDRUCK ]] && {BEFEHL;BEFEHL;}
    (letztes Semikolon muß sein)

Code:
#!/usr/bin/env bash
# TODO: Austauschen gegen networksetup -listnetworkserviceorder
LISTSERVICES="cat networksetup-listnetworkserviceorder.txt"
# TODO: Austauschen gegen airport -I
AIRPORTI="cat airport-I.txt"
AIRPORTI="cat airport-I-off.txt"

# Ermitteln ob WLAN aktiv
WLANACTIVE=1
($AIRPORTI|grep -q 'AirPort: Off') && WLANACTIVE=0

# Entsprechend 'schöne' Ausgaben erzeugen
if (( WLANACTIVE )); then
  echo "WLAN ist aktiv"
  $AIRPORTI|while read line; do
    case "$line" in
    agrCtlRSSI:*)
      # Ausgabe kannste hier anpassen
      echo "Empfangsqualität: ${line##*: } dB"
      ;;
    lastTxRate:*)
      # ... und hier
      echo "Aktuelle Geschwindigkeit: ${line##*: }"
      ;;
    *)
      ;;
    esac
  done
else
  echo "WLAN ist nicht aktiv"
fi

# Geräte ermitteln
#             ... unnötige Teile herausschneiden.
$LISTSERVICES|sed '/Device:/!d; s/^.*:\s\s*\(.*\),\s\s*Device:\s\s*\(.*\).$/\1:\2/i;'|while read device; do
  # Wichtige Teile extrahieren (Format pro Zeile ist <name>:<interface>)
  NAME=${device%%:*}
  IFACE=${device##*:}
  case "$IFACE" in
  en*)
    echo "$IFACE"
    # TODO: hier muß erweitert werden
    ;;
  *)
    ;;
  esac
done
Alle TODO beachten!

Bei den Interfaces wird es schwer ohne die genauen Ausgaben oder Exitcodes der verschiedenen Fälle zu kennen. Aber ich denke das gibt dir zumindest einen Ansatz. Wir können es ja noch ausbauen wenn du mir noch ein paar Informationsbrocken zukommen läßt.

In jedem Fall würde ich dir empfehlen die Rohdaten in eine Datei zu schreiben und diese nur zu aktualisieren wenn x Sekunden vergangen sind. Denn ansonsten haste soviele Aufrufe in einem Skript welches eigentlich nur im Hintergrund laufen soll, daß es einfach nicht mehr feierlich wäre.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat