Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Gute Tutorials / Beispiele zu sed und awk gesucht (https://www.delphipraxis.net/157142-gute-tutorials-beispiele-zu-sed-und-awk-gesucht.html)

Phoenix 31. Dez 2010 10:00

Betriebssystem: Mac OS,Linux

Gute Tutorials / Beispiele zu sed und awk gesucht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ich bastel gerade an meinem neuen MacBook Air rum, und zwar erstelle ich gerade einen neuen Desktop (siehe Screenshot).
Die Ausgaben (Uhrzeit/Datum, Systemname, Batteriestatus, Wlan-Info) zeige ich mittels Geektool an.

Geektool führt Kommandozeilenscripte aus und schreibt deren Ausgabe 1:1 auf den Desktop.
Nun will ich noch komplexere Ausgaben machen: einzelne Network-Interfaces nur dann anzeigen, wenn sie auch an sind (z.B. iPhone-Bluetooth oder USB-Tethering, USB-Ethernet-Adapter) etc. mit Netwerk-SSID (wenn WLAN) und erhaltener IP-Adresse etc.

Die ganzen Infos erhalte ich mittels Kommandozeilentools, aber zum Teil sind dafür mehrere Aufrufe notwendig (z.B. "networksetup -listnetworkserviceorder | grep Device:", und was dann nach Device steht als input für ifconfig nehmen um den Status und die IP-Adressen aus der inet-Zeile ("inet 192.168.178.34 netmask 0xffffff00 broadcast 192.168.178.255") auszulesen).

Ich suche nun gute / erprobte Dokumentationen, Cheatsheets oder Tutorials für sed, awk und generell Shell-Scripting auf Unixoiden Betriebssystemen, so dass ich mir die einzelnen Werte aus der Ausgabe eines Kommandos als Input in einen (oder mehrere) Aufrufe anderer Kommandos schieben kann und mir so meine Ausgabe selber zusammenstellen kann.

Wer hat hier eine taugliche Linksammlung zu Shellscripting, sed, awk, grep etc.?

Assarbad 31. Dez 2010 10:56

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
Die ersten beiden habe ich selber (und gelesen):
  • Bei Google suchenISBN 978-0596526788 (bash Cookbook)
  • Bei Google suchenISBN 978-1565922259 (sed and awk)
  • Wenn du kein Bash hast: Bei Google suchenISBN 978-0596005955 (Classic Shell Scripting), ich bevorzuge persönlich Bash ... zumal ich aus deiner Beschreibung noch nicht direkt entnehmen kann wo sed/awk benötigt würden und Bash an seine Grenzen stieße.

Ansonsten zu sed:

http://sed.sourceforge.net/grabbag/tutorials/

awk ist zwar mächtig, aber ich benutze es trotzdem höchst selten.

Zu Bash gibt es haufenweise Quellen im Netz, aber stell doch einfach mal ein paar konkrete Fragen. Auch wenn ich keinen Mac zur Hand habe, kann man oft schon anhand der Ausgabe und dem Teil den du extrahieren willst Code schreiben ...

Nachtrag:
  • Wenn du ohnehin viel in der Shell arbeitest, empfehle ich dir Bei Google suchenbyobu, welches es mittlerweile für die meisten unixoiden Systeme in funktionaler Form gibt.
  • Zum Ermitteln der IP-Adressen benutzt man heutzutage übrigens "ip addr" (das Tool "ip" ist weit mächtiger).

Phoenix 31. Dez 2010 12:39

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
Ja, es ist bash. Das Tool 'ip' habe ich hier auf OSX Snow Leopard aber nicht.

Ich habe z.B. folgende Ausgaben:
Code:
Last login: Thu Dec 30 22:58:25 on ttys001
smartair:~ Sebastian$ airport -I
AirPort: Off
smartair:~ Sebastian$ networksetup -setairportpower en0 on
smartair:~ Sebastian$ airport -I
     agrCtlRSSI: -59
     agrExtRSSI: 0
    agrCtlNoise: -95
    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$
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.

Welche Geräte welchen sprechenden Namen haben sehe ich hier:
Code:
smartair:~ Sebastian$ networksetup -listnetworkserviceorder
An asterisk (*) denotes that a network service is disabled.
(1) Bluetooth DUN
(Hardware Port: Bluetooth DUN, Device: Bluetooth-Modem)

(2) USB Ethernet
(Hardware Port: USB-Ethernet, Device: en3)

(3) AirPort
(Hardware Port: AirPort, Device: en0)

(4) iPhone
(Hardware Port: iPhone-USB, Device: en2)

(5) Bluetooth PAN
(Hardware Port: Bluetooth PAN, Device: en1)

smartair:~ Sebastian$ networksetup -listnetworkserviceorder | grep Device
(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)
smartair:~ Sebastian$
Wie man sieht reicht die untere Ausgabe um den sprechenden Namen und den Interface-Namen zu ermitteln.

Hier muss ich dann mit einem folgenden ifconfig die Status ermitteln:

Code:
smartair:~ Sebastian$ ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
   ether 10:93:e9:00:ca:1a
   inet6 fe80::1293:e9ff:fe00:ca1a%en0 prefixlen 64 scopeid 0x4 
   inet 192.168.178.34 netmask 0xffffff00 broadcast 192.168.178.255
   media: autoselect
   status: active
smartair:~ Sebastian$ ifconfig en1
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
   ether 10:93:e9:00:ca:1b
   media: autoselect
   status: inactive
smartair:~ Sebastian$ ifconfig en2
ifconfig: interface en2 does not exist
smartair:~ Sebastian$ ifconfig en3
ifconfig: interface en3 does not exist
smartair:~ Sebastian$
Wie man sieht ist mein iPhone weder per Bluetooth PAN (en1 - inactive) noch per USB (en2) verbunden, noch ist der externe USB-Ethernet-Adapter (en3) angeschlossen. Hier sollte also jedes mal 'not connected' stehen. Wenn connected (so wie das WLAN en0), so soll die aktuelle IPv4 Adresse, die Geschwindigkeit (sofern ermittelbar) und bei Wifi eben noch die SSID angezeigt werden.

Dazu gibt es dann noch die Liste der aktuell verfügbaren WLAN's, von denen mir die SSID reichen würde, die Signalstärke (RSSI) wäre aber auch cool und ggf. die Security (wobei hier secured bzw. offen reichen würde):
Code:
smartair:~ Sebastian$ airport -s
                            SSID BSSID            RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
                     WLAN-3C0C43 88:25:2c:3c:0c:c9 -89  6,-1    Y DE WPA(PSK/TKIP,AES/TKIP) WPA2(PSK/TKIP,AES/TKIP)
                 smartNet Office 06:24:fe:b6:a6:7a -51  1,+1    Y -- WPA(PSK/TKIP/TKIP) WPA2(PSK/AES/TKIP)
                 smartNet Studio 06:24:fe:b2:8e:57 -68  1,+1    Y -- WPA(PSK/TKIP/TKIP) WPA2(PSK/AES/TKIP)
              smartNet Gast WLAN 06:24:fe:44:d0:7b -48  1,+1    Y -- WPA(PSK/TKIP/TKIP) WPA2(PSK/AES/TKIP)
                        smartNet 00:24:fe:44:d0:7b -47  1,+1    Y -- WPA(PSK/TKIP/TKIP) WPA2(PSK/AES/TKIP)
smartair:~ Sebastian$
Ich bin im Text parsen noch nicht so bewandert, deswegen weiss ich gar nicht, welche Tools hier die besten sind um die entsprechenden Stellen sauber zu extrahieren.

Assarbad 31. Dez 2010 12:43

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
Ich gucke es mir später genauer an. Muß erst noch ein paar Dinge erledigen.

BUG 31. Dez 2010 15:01

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
Ich bin bei der Tutorialsuche zum Schnuppern hierauf gestoßen, finde ich eigentlich ganz gut strukturiert, ausprobiert habe ich es noch nicht.

rollstuhlfahrer 31. Dez 2010 15:06

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
oder das hier: http://wiki.ubuntuusers.de/sed (inkl. Beispiele und teilweise Parameter-Erklärung).

Bernhard

ADD: Ansonsten kann ich die MAN-Pages nur empfehlen ("man sed" in der Konsole auf Linux, Mac?)
ADD2: "info sed" ist sogar noch ausführlicher.

Assarbad 31. Dez 2010 15:46

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
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:

Zitat:

Zitat von Phoenix (Beitrag 1071420)
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.

Phoenix 31. Dez 2010 16:24

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
Zitat:

Zitat von Assarbad (Beitrag 1071491)
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.

Assarbad 31. Dez 2010 17:22

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
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.

Phoenix 2. Jan 2011 12:09

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
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 :)

Phoenix 3. Jan 2011 06:44

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:
#!/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 ;-)

Assarbad 3. Jan 2011 12:08

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
Zitat:

Zitat von Phoenix (Beitrag 1071905)
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"

Phoenix 3. Jan 2011 12:15

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:
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;'

Phoenix 3. Jan 2011 15:10

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: 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?

Assarbad 3. Jan 2011 17:00

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
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.

Phoenix 3. Jan 2011 17:13

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

Assarbad 3. Jan 2011 18:37

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:
# 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.

Phoenix 3. Jan 2011 21:34

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
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.

Phoenix 4. Jan 2011 06:45

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:
#!/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 :) ).

Assarbad 4. Jan 2011 08:37

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
Zitat:

Zitat von Phoenix (Beitrag 1072111)
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).

Phoenix 4. Jan 2011 08:59

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
Das alte sed hat aber wie gesagt zumindest bei mir nicht die gewünschte Ausgabe :)

Assarbad 4. Jan 2011 10:08

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
Aaah, gerade auf unserem Mac mini geschaut. Handelt sich also um BSD sed.

Versuch mal:

Code:
sed -E -e '/Device:/!d; s/^\(Hardware Port: *(.*), *Device: *(.*)\)$/\2:\1/'
Bei mir ergibt das:
Code:
Bluetooth-Modem:Bluetooth DUN
en3:USB-Ethernet
en0:AirPort
en2:iPhone-USB
en1:Bluetooth PAN
... welches man durch sort und dann durch ein while read jagen kann ...

Phoenix 4. Jan 2011 10:58

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
Dann schau ich mal dass ich das nachher in der Mittagspause zusammenpfriemel. Diese Regex da versteh ich schon längen besser als die davor *g* :)

Hervorragend, so tut's jetzt :)
Code:
#!/usr/bin/env bash
echo "Network information:"
echo "===================="
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
        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

# Geräte ermitteln
#             ... unnötige Teile herausschneiden.

while read device; do
   #empty line / placeholder
   echo
   IFACE=${device%%:*}
   NAME=${device##*:}

   case "$IFACE" in
        en*)
             echo "Interface: $NAME"
         echo "========================"
         ifconfig $IFACE
             # TODO: hier muß erweitert werden
          ;;
      Bluetooth-Modem*)
         #echo $NAME
      ;;
        *)
          ;;
     esac
done < <($LISTSERVICES|sed -E -e '/Device:/!d; s/^\(Hardware Port: *(.*), *Device: *(.*)\)$/\2:\1/'|sort)
Die Ausgabe bisher:
Code:
smartair:Scripte Sebastian$ ./networkinfo.sh
Network information:
====================
WIFI:       enabled
Network:    SH_SECURED_1OG
Speed:      54 Mbit/s
Quality:    -61 dB



Interface: AirPort
========================
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
   ether 10:93:e9:00:ca:1a
   inet6 fe80::1293:e9ff:fe00:ca1a%en0 prefixlen 64 scopeid 0x4 
   inet 192.168.2.120 netmask 0xffffff00 broadcast 192.168.2.255
   media: autoselect
   status: active

Interface: Bluetooth PAN
========================
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
   ether 10:93:e9:00:ca:1b
   media: autoselect
   status: inactive

Interface: iPhone-USB
========================
ifconfig: interface en2 does not exist

Interface: USB-Ethernet
========================
ifconfig: interface en3 does not exist
smartair:Scripte Sebastian$

Assarbad 6. Jan 2011 19:19

AW: Gute Tutorials / Beispiele zu sed und awk gesucht
 
Cool. Wird dann noch was gebraucht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 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