AGB  ·  Datenschutz  ·  Impressum  







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

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
Seite 2 von 3     12 3      
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#11

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 07: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
 
#12

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 13: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.641 Beiträge
 
#13

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 13: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 13:27 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#14

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 16: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
Benutzerbild von Assarbad
Assarbad

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

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 18:00
Haste GNU sed, manchmal als gsed verfügbar?

Wenn nicht, sollte folgendes auch funzen:

Code:
sed '/[dD]evice:/!d; s/^.*:\s\s*\(.*\),\s\s*[dD]evice:\s\s*\(.*\).$/\1:\2/i;'
Das war aber nur um den Fall zu behandeln falls mal "device" ohne Großbuchstaben auftaucht. Stattdessen kannste auch versuchen mal die 'i' komplett zu entfernen. Wenn die Ausgabe exakt mit "Device" und nie als "device" kommt, funzt es trotzdem.
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.641 Beiträge
 
#16

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 18:13
Leider kein gsed da. Aber ohne das i hinter dem letzten / gehts so halber.
Die Regex scheint noch nicht so ganz zu passen.

Code:
#!/usr/bin/env bash
# ...
# Geräte ermitteln
#             ... unnötige Teile herausschneiden.
$LISTSERVICES|sed '/Device:/!d; s/^.*:\s\s*\(.*\),\s\s*Device:\s\s*\(.*\).$/\1:\2/;'|while read device; do
  # Wichtige Teile extrahieren (Format pro Zeile ist <name>:<interface>)
  NAME=${device%%:*}
  IFACE=${device##*:}

# mal debug-Ausgabe ;-):
echo "$NAME"
echo "$IFACE"

  case "$IFACE" in
  en*)
    echo "$IFACE"
    # TODO: hier muß erweitert werden
    ;;
  *)
    ;;
  esac
done
Auf der Kommandozeile erhalte ich folgende Ausage von networksetup -list.. | sed 'blablub':
Code:
(Hardware Port: Bluetooth DUN, Device: Bluetooth-Modem)
(Hardware Port: USB-Ethernet, Device: en3)
(Hardware Port: AirPort, Device: en0)
(Hardware Port: iPhone-USB, Device: en2)
(Hardware Port: Bluetooth PAN, Device: en1)
Die Ausgabe des Teilscriptes ist dann folgende:
Code:
(Hardware Port
 Bluetooth-Modem)
(Hardware Port
 en3)
(Hardware Port
 en0)
(Hardware Port
 en2)
(Hardware Port
 en1)
Also wird durch die Regex nicht der Name gematched sondern der Anfang der Zeile und beim iface haben wir noch das zusätzliche Leerzeichen vor dem Device-Namen und hinten die Klammer.

Bei der Gelegenheit möchte ich nochmal anmerken dass ich Reguläre Echsen zwar für irgendwie geil halte, aber in so einem Fall das herumwickeln der eigenen Hirnwindungen um so einen Ausdruck mehr als schwierig ist
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
 
#17

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 19:37
Seltsam, ich wüßte nicht wo da was falsch ist. Kann höchstens sein, daß das sed im Mac irgendwie ne andere Vorstellung von Regexen hat als GNU sed. Das ist leider hin und wieder der Fall:

Code:
# Alle Zeilen mit 'Device:' nicht löschen
/Device:/!d;
# Am Anfang der Zeile alles bis zum Doppelpunkt und dann jegliche Leerzeichen finden,
# alles ab da bis zum Komma in Gruppe 1 einfangen.
# Nach dem Komma jegliche Leerzeichen sowie 'Device:' und folgende Leerzeichen finden,
# ab da alles bis auf das letzte Zeichen in Gruppe 2 einfangen
s/^.*:\s\s*\(.*\),\s\s*Device:\s\s*\(.*\).$/
# Gruppen so ausgeben: $1:$2
\1:\2/;
Ich werd nachher nochmal auf unserem Mac mini gucken.
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.641 Beiträge
 
#18

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 3. Jan 2011, 22:34
Habs. Im Moment siehts so aus:

Code:
#!/usr/bin/env bash
LISTSERVICES="networksetup -listnetworkserviceorder"
AIRPORTI="airport -I"

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

# Entsprechend 'schöne' Ausgaben erzeugen
if (( WLANACTIVE )); then
     $AIRPORTI|{
   while read line; do
          case "$line" in
             agrCtlRSSI:*)
            QUALITY=${line##*: }
               ;;
             lastTxRate:*)
            SPEED=${line##*: }
               ;;
             SSID:*)
            SSID=${line##*: }
            
               ;;
         channel:*)
            CHANNEL=${line##*: }
         ;;    
             *)
               ;;
          esac
    done

   if [ "$SSID" = "SSID:" ]; then
      echo "WIFI:       enabled (not connected)"
   else
      echo "WIFI:       enabled"
      echo "Network:    $SSID"
      echo "Speed:      $SPEED Mbit/s"
          echo "Quality:    $QUALITY dB"
   fi
   }
else
   echo "WIFI:       disabled"
fi

# make some lines
echo
echo

# Geräte ermitteln
#             ... unnötige Teile herausschneiden.
$LISTSERVICES|sed '/Device:/!d; s/^.*:\s\s*\(.*\),\s\s*Device:\s\s*\(.*\).$/\1:\2/;'|while read device; do
  # Wichtige Teile extrahieren (Format pro Zeile ist <name>:<interface>)
   NAME=${device#*: }
   NAME=${NAME%%,*)}
   IFACE=${device##*: }
    IFACE=${IFACE%%)}
  case "$IFACE" in
  en*)
       echo "Interface: $NAME : $IFACE"
   ifconfig $IFACE
    # TODO: hier muß erweitert werden
    ;;
  *)
    ;;
  esac
done
Die ifconfig $IFACE ausgabe tut auch schon - jetzt muss ich hier nur noch die Ausgabe auseinanderpfriemeln und dann je nach Status (existiert nicht, active, inactive) so wie beim WLAN jetzt die Ausgabe zusammenbauen.
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.641 Beiträge
 
#19

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 4. Jan 2011, 07:45
Boah ey. Subshells sind ekelhaft Hab noch ein bisschen getweaked damit's einfacher mit den Variablen wird.

Der sed - aufruf für die Geräteliste liefert im übrigen definitiv nicht "Name : deviceName" zurück sondern die Zeile 1:1 wie aus dem original-Aufruf. Da würde auch ein simples 'grep "Device:"' reichen:

Code:
#!/usr/bin/env bash
echo "Network information:"
echo "===================="
LISTSERVICES="networksetup -listnetworkserviceorder"
AIRPORTI="airport -I"

# WIFI
WLANACTIVE=1
($AIRPORTI|grep -q 'AirPort: Off') && WLANACTIVE=0

# Entsprechend 'schöne' Ausgaben erzeugen
if (( WLANACTIVE )); then
        while read line; do
          case "$line" in
             agrCtlRSSI:*)
            QUALITY=${line##*: }
               ;;
             lastTxRate:*)
            SPEED=${line##*: }
               ;;
             SSID:*)
            SSID=${line##*: }
            
               ;;
         channel:*)
            CHANNEL=${line##*: }
         ;;    
             *)
               ;;
          esac
    done < <($AIRPORTI)

   if [ "$SSID" = "SSID:" ]; then
      echo "WIFI:       enabled (not connected)"
   else
      echo "WIFI:       enabled"
      echo "Network:    $SSID"
      echo "Speed:      $SPEED Mbit/s"
          echo "Quality:    $QUALITY dB"
   fi
else
   echo "WIFI:       disabled"
fi

# make some lines
echo
echo

# Devices
while read device; do
   # Erst vorne, dann hinten abschneiden, jeweils für Name und Interfacename
   NAME=${device#*: }
   NAME=${NAME%%,*)}
   IFACE=${device##*: }
    IFACE=${IFACE%%)}
    
   case "$IFACE" in
        en*)
             echo "Interface: $NAME : $IFACE"
         ifconfig $IFACE
             # TODO: hier muß erweitert werden
          ;;
        *)
          ;;
     esac
done < <($LISTSERVICES|grep "Device:")
Gibts eigentlich ne Möglichkeit die Ausgabe nach enX zu sortieren und nicht einfach nur Zeilenweise durch den Input durchzuorgeln? (Ich weiss, jetzt wirds unverschämt ).
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org

Geändert von Phoenix ( 4. Jan 2011 um 07:46 Uhr) Grund: Ne Klammer vergessen.
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

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

AW: Gute Tutorials / Beispiele zu sed und awk gesucht

  Alt 4. Jan 2011, 09:37
Gibts eigentlich ne Möglichkeit die Ausgabe nach enX zu sortieren und nicht einfach nur Zeilenweise durch den Input durchzuorgeln? (Ich weiss, jetzt wirds unverschämt ).
Gibt es, ja. Allerdings wird das schwer so wie es nun aussieht. Vorher hätte man in dem sed-Befehl nur $1 und $2 andersrum ausgeben müssen. Im Grunde mußt du die Liste in einer Variablen einfangen so daß du bspw. (außerdem wäre in diesem Fall das Problem, daß vor dem Ermitteln des Namens des Gerätes der Interfacename ermittelt werden müßte, da ersterer Leerzeichen enthalten kann):

Code:
INTERFACES="en0 en4 en3"
Danach kannste dann bspw. so an die sortierte Liste kommen:

Code:
(for i in $INTERFACES; do echo $i; done)|sort|while ...
Nochmals, würde das alte sed benutzt, wäre dies kein Problem, weil du dann eben die erhaltene Liste einmal durch sort jagen könntest und erst dann ausgeben müßtest (aber eben mit für $1 und $2 getauschten Positionen).
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 21:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz