AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Delphi-PRAXiS - Lounge Betriebssysteme Gute Tutorials / Beispiele zu sed und awk gesucht

Gute Tutorials / Beispiele zu sed und awk gesucht

Ein Thema von Phoenix · begonnen am 31. Dez 2010 · letzter Beitrag vom 6. Jan 2011
Antwort Antwort
Benutzerbild von Assarbad
Assarbad

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

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 31. Dez 2010, 15:46
Also, der Mac mini in der Firma über VPN hat einige dieser Tools nicht, also werde ich stattdessen deine Ausgaben übernehmen und cat benutzen.

So, noch ein kleiner Kommentar:

Das heisst hiermit kann ich ermitteln, ob das WLAN an ist, wenn ja wie die SSID ist und die aktuelle Geschwindigkeit (lastTxRate) und die Empfangsqualität (agrCtlRSSI) in Db.
Du unterschlägst mir doch hier den Exitcode ... der könnte nämlich auch die Info enthalten ob's aus ist.

Einerlei. Ich schau jetzt mal rein.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.643 Beiträge
 
#2

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 31. Dez 2010, 16:24
Du unterschlägst mir doch hier den Exitcode ... der könnte nämlich auch die Info enthalten ob's aus ist.
Tut er leider nicht

Code:
smartair:~ Sebastian$ airport -I
     agrCtlRSSI: -60
     agrExtRSSI: 0
    agrCtlNoise: -94
    agrExtNoise: 0
          state: running
        op mode: station
     lastTxRate: 130
        maxRate: 144
lastAssocStatus: 0
    802.11 auth: open
      link auth: wpa2-psk
          BSSID: 0:24:fe:44:d0:7b
           SSID: smartNet
            MCS: 15
        channel: 1
smartair:~ Sebastian$ echo $?
0
smartair:~ Sebastian$ airport -I
AirPort: Off
smartair:~ Sebastian$ echo $?
0
In beiden Fällen null.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

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

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 31. Dez 2010, 17: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
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.643 Beiträge
 
#4

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 2. Jan 2011, 12:09
Cool, Danke! Ich denke ich werde mir das morgen früh im Zug mal im Detail ansehen und schauen dass ich da was gescheites mit hinbekomme
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.643 Beiträge
 
#5

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 06:44
Also bei mir geht das so leider nicht.

Ich habe genau Dein Script und dabei nur den Input durch die echten calls ersetzt:

Code:
#!/usr/bin/env bash
# TODO: Austauschen gegen networksetup -listnetworkserviceorder
# LISTSERVICES="cat networksetup-listnetworkserviceorder.txt"
LISTSERVICES=`networksetup -listnetworkserviceorder`
# TODO: Austauschen gegen airport -I
AIRPORTI=`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
Die Ausgabe ist dann folgende:

Code:
smartair:Scripte Sebastian$ ./networkinfo.sh
./networkinfo.sh: line 12: agrCtlRSSI:: command not found
WLAN ist aktiv
./networkinfo.sh: line 17: agrCtlRSSI:: command not found
./networkinfo.sh: line 37: An: command not found
sed: 1: "/Device:/!d; s/^.*:\s\s ...": bad flag in substitute command: 'i'
smartair:Scripte Sebastian$
Er scheint irgendwie mit dem case-Statement und den Ausdrücken dort Probleme zu haben. Sollte mir wohl doch das Bash-Buch mal zulegen
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

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

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 12:08
Also bei mir geht das so leider nicht.

Ich habe genau Dein Script und dabei nur den Input durch die echten calls ersetzt
Nope, haste nicht. Du hast es gegen die Ausgabe der echten Aufrufe ersetzt

Code:
AIRPORTI=`airport -I`
wird die Variable im besten Fall mit der Ausgabe von "airport -I" füllen, im schlimmsten Fall nicht funktionieren, weil diese Ausgabe mehrere Zeilen hat.

Versuch:

Code:
AIRPORTI="airport -I"
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.643 Beiträge
 
#7

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 12:15
Ah, I see. Jetzt kapier ich das
Jetzt macht auch die Ausgabe Sinn
Ich muss mir das nach dem Mittagsmampf nochmal kurz angucken.

Update:
Ah, fein. Jetzt hab ichs geschnakelt. Die WLAN-Ausgabe tut.

Das Problem weiter unten besteht aber weiter:
Code:
sed: 1: "/Device:/!d; s/^.*:\s\s ...": bad flag in substitute command: 'i'
Die gleiche Meldung kommt auch, wenn ich das direkt auf der Shell so reinpipe:
Code:
networksetup -listnetworkserviceorder|sed '/Device:/!d; s/^.*:\s\s*\(.*\),\s\s*Device:\s\s*\(.*\).$/\1:\2/i;'
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org

Geändert von Phoenix ( 3. Jan 2011 um 12:27 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.643 Beiträge
 
#8

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 15:10
Hrm.. das /i (ignore case flag) wird von sed auf OS X offenbar nicht unterstützt.

Siehe auch hier: http://groups.google.com/group/macen...0e299cae?pli=1

Gibts eine andere Idee / wird das wirklich benötigt oder muss ich wie in dem Beispiel den Aufruf auf perl umstellen?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz