![]() |
AW: Gute Tutorials / Beispiele zu sed und awk gesucht
Also bei mir geht das so leider nicht.
Ich habe genau Dein Script und dabei nur den Input durch die echten calls ersetzt:
Code:
Die Ausgabe ist dann folgende:
#!/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
Code:
Er scheint irgendwie mit dem case-Statement und den Ausdrücken dort Probleme zu haben. Sollte mir wohl doch das Bash-Buch mal zulegen ;-)
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$ |
AW: Gute Tutorials / Beispiele zu sed und awk gesucht
Zitat:
Code:
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.
AIRPORTI=`airport -I`
Versuch:
Code:
AIRPORTI="airport -I"
|
AW: Gute Tutorials / Beispiele zu sed und awk gesucht
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:
Die gleiche Meldung kommt auch, wenn ich das direkt auf der Shell so reinpipe:
sed: 1: "/Device:/!d; s/^.*:\s\s ...": bad flag in substitute command: 'i'
Code:
networksetup -listnetworkserviceorder|sed '/Device:/!d; s/^.*:\s\s*\(.*\),\s\s*Device:\s\s*\(.*\).$/\1:\2/i;'
|
AW: Gute Tutorials / Beispiele zu sed und awk gesucht
Hrm.. das /i (ignore case flag) wird von sed auf OS X offenbar nicht unterstützt.
Siehe auch hier: ![]() Gibts eine andere Idee / wird das wirklich benötigt oder muss ich wie in dem Beispiel den Aufruf auf perl umstellen? |
AW: Gute Tutorials / Beispiele zu sed und awk gesucht
Haste GNU sed, manchmal als gsed verfügbar?
Wenn nicht, sollte folgendes auch funzen:
Code:
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.
sed '/[dD]evice:/!d; s/^.*:\s\s*\(.*\),\s\s*[dD]evice:\s\s*\(.*\).$/\1:\2/i;'
|
AW: Gute Tutorials / Beispiele zu sed und awk gesucht
Leider kein gsed da. Aber ohne das i hinter dem letzten / gehts so halber.
Die Regex scheint noch nicht so ganz zu passen.
Code:
Auf der Kommandozeile erhalte ich folgende Ausage von networksetup -list.. | sed 'blablub':
#!/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
Code:
Die Ausgabe des Teilscriptes ist dann folgende:
(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)
Code:
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.
(Hardware Port
Bluetooth-Modem) (Hardware Port en3) (Hardware Port en0) (Hardware Port en2) (Hardware Port en1) 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 :stupid: |
AW: Gute Tutorials / Beispiele zu sed und awk gesucht
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:
Ich werd nachher nochmal auf unserem Mac mini gucken.
# 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/; |
AW: Gute Tutorials / Beispiele zu sed und awk gesucht
Habs. Im Moment siehts so aus:
Code:
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.
#!/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 |
AW: Gute Tutorials / Beispiele zu sed und awk gesucht
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:
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 :) ).
#!/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:") |
AW: Gute Tutorials / Beispiele zu sed und awk gesucht
Zitat:
Code:
Danach kannste dann bspw. so an die sortierte Liste kommen:
INTERFACES="en0 en4 en3"
Code:
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).
(for i in $INTERFACES; do echo $i; done)|sort|while ...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 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