[BASH] Frickler-Pipes

L I V E Stammtisch ab 20:30 Uhr im Chat
  • framp  Andreas Ihr wollt 2021, gerade wenn es über versch. Distros hinweg gehen soll, kein ifconfig mehr, sondern ip (iproute2) benutzen. Damit bekommt man auch eine besser zu parsende 1-zeilige Ausgabe (für code-block aber zu lang), a la

    Code
    $ ip -br a s dev eth0
    
    eth0             UP             192.168.11.201/24 fd5f:9920:8bc2:0:39e2:26d3:8c43:27e4/64   \ 
        fd5f:9920:8bc2:0:39e2:26d3:8c43:27e5/64 ... .... 

    Oder gleich irgendwas wirklich sicheres.

    Ansonsten zu den i18n etc. Stellt einfach immer ein LANG=C davor, dann ist das Parsen entschärft.

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • Stimmt. Ich habe jahrzehntelang ifconfig benutzt und bin auch dabei mir ip anzugewoehnen - aber vergesse das doch immer mal wieder :-/

    Jedenfalls kann man das auch mit Regex parsen :)

    Code
    ip -br a s dev wlp3s0 |  LANG=C grep -o -E "([[:space:]])*([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}" | tr -d ' '
  • ip -br a s dev wlp3s0 | LANG=C grep -o -E

    Dort ist das LANG aber nicht mehr sinnvoll, wenn dann vor dem zu parsenden Kommando, hier "ip". :)

    (Hier ohnehin egal/überflüssig, weil kein Text geparsed wird.)

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • Hallo Ihr Unermüdlichen,

    bei mir kommt bei bei Verwendung von ip -br ...  eine Fehlermeldung...

    Code
    Option "-br" is unknown, try "ip -help".

    Mir gefällt die Regex-Sache(*) von framp irgendwie ganz gut... und habe mal versucht das moderne "ip" mit dem Regex-Ansatz zu kreuzen:

    Code
    ip -4 a s wlan0 | grep inet | grep -o -E "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}" | head -n 1

    liefert exakt die gewünschte IP-Adresse.

    Das hier auch

    Code
    ip a s dev wlan0 | grep inet | grep -o -E "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}" | head -n 1

    Beste Grüße

    Andreas


    P.S.: Sollte ich mich auf meine alten Tage wirklich noch damit auseinandersetzen? Mein letzter Versuch mit Regex stammt aus dem Jahr 2013. Ich brauchte schlappe 2 Wochen, um die Fehlermeldung einer Programmiersprache auszuwerten, um daraus die Zeilennummer und Spalte zu erhalten, damit der Editor auf diese Textposition seinen Cursor setzen kann. Und dies nur, weil der Editor extra für diesen Zweck Regex-kompatibel war und weiterhin ist.

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Lutz,

    was sagt ip -Vbzw. apt-cache policy iproute2

    dieses:

    Code
    $ip -V
    ip utility, iproute2-ss131122

    und dieses:

    Code
    $apt-cache policy iproute2
    iproute2:
      Installiert:           3.12.0-2ubuntu1.2
      Installationskandidat: 3.12.0-2ubuntu1.2
      Versionstabelle:
     *** 3.12.0-2ubuntu1.2 0
            500 http://de.archive.ubuntu.com/ubuntu/ trusty-updates/main amd64 Packages
            100 /var/lib/dpkg/status
         3.12.0-2 0
            500 http://de.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo hyle,

    hostname knallt Dir nur eine Liste von IP-Adressen im IP4v und IP6v-Format vor den Latz. Es bleibt vollkommen offen, was jetzt WLAN oder LAN oder WWAN oder ... ist.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Sollte ich mich auf meine alten Tage wirklich noch damit auseinandersetzen?

    Im konkreten Beispiel muss man nicht parsen. Wir haben ja schon Loesungen gesehen ohne Regex. Aber immer wenn man Dinge parsen bzw Elemente aus Texten extrahieren muss ist ein Regex ein sehr maechtiges und kompaktes Werkzeug. Du findest regex auch bei sed, grep, awk, find, und an vielen anderen Stellen (regex ist ein wichtiger Bestandteil von perl) weil es eben ein maechtiges Tools ist um bestimmte Textstrukturen zu erkennen. Ob Du das noch brauchst kannst Du am besten beurteilen.

    Ich denke wenn Du Dich mal einen Abend konzentriert hinsetzt und eine der vielen Webseiten durchgehst die es zu Regex gibt hast Du das Grundprinzip der Regex verstanden und kannst sie anwenden. So high sophistikatete Dinge wie lookahead und lookbehind habe ich bislang so gut wie nie benoetigt. Damit kannst Du dann auch einfache Grammatiken parsen. Ist aber meiner Meinung Overkill und man sollte dann vielleicht Yacc und Lexx einsetzen denn wenn Regex ein unlesserlicher langer Bandwurm wird ist der nicht mehr wartbar.

  • Hallo __blackjack__,

    Icon's String-Scanning wäre in der Tat der nächste Ansatz gewesen - man braucht aber gar nicht so tief einzusteigen, da ein simples

    Code
    s := piper("ip -4 a s wlan0 | grep inet")
    suchvon := "inet "
    suchbis := "/"
    ergebnis := s[find(suchvon, s)+*suchvon:find(suchbis, s)]

    die reine IP-Adresse liefert.

    Aber da Du Icon's String-Scanning angesprochen hast - damit geht es natürlich auch:

    Code
    s := piper("ip -4 a s wlan0 | grep inet")
    suchvon := "inet "
    suchbis := "/"
    ergebnis := (s ? { tab(find(suchvon) + *suchvon) & tab(find(suchbis))})

    Oder kürzer, hübscher und mehr Icon-Style:

    Code
    write(s ? {tab(many(&letters ++ ' ')) & tab(many(&digits ++ "."))})

    Code-Deutung:

    In der Variablen s befindet sich das Ergebnis der Pipe

    Code
    ip -4 a s wlan0 | grep inet

    Die Funktion piper() liefert entweder

    • das Ergebnis &fail (wenn die Pipe kein Ergebnis geliefert hat; nachfolgende Funktionen, die ein solches Ergebnis verwenden, werden ohne weitere Prüfung nicht aufgerufen)
    • eine Zeichenkette (wenn die Pipe nur eine einzige Zeil geliefert hat)
    • eine Liste (wenn die Pipe mehrere Zeilen geliefert hat)

    Also etwas wie "inet 192.168.2.119/24 brd 192.168.2.255 scope global wlan0".

    Mit dem (binären) Operator Scanning-Operator ? wird das String-Scanning losgetreten. Links davon befindet sich die Zeichenkette, die in das String-Scanning eingekippt wird. Rechts davon befindet sich die sog. Matching Function. Die ersten Zeichen der Zeichenkette, die aus Elementen der Menge der Buchstaben (Schlüsselwort &letters) bestehen, vereinigt (mittels Operator ++) mit der Menge der Zeichen "Leerzeichen", werden übersprungen (Funktion many()) und an diese Stelle gesprungen (Funktion tab()).

    Ab dort sollen so viele Zeichen wie möglich (ausgedrückt durch die Funktion many() genommen werden, solange diese in der Menge der Ziffern (Schlüsselwort &digits) vereinigt mit der Menge der Zeichen "Punkt" enthalten sind. Ab der Stelle (ausgedrückt durch die Funktion tab()), an der das erste Zeichen außerhalb dieser Vereinigungsmenge enthalten ist, wird der Rest der Zeichenkette verworfen.

    Übrig bleibt somit eine Zeichenkette übrig, die mit der ersten Ziffer (oder Punkt) beginnt, und mit der letzten Ziffer (oder Punkt) endet, ohne dass Zeichen enthalten sind, die weder Ziffern noch Punkte sind.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    5 Mal editiert, zuletzt von Andreas (8. Januar 2021 um 17:45)

  • Offensichtlich hat Icon auch eine eigene Implementierung der Regexfunktionalitaet. :thumbup:

    Allerdings mit einer voellig anderen Syntax als die unter Linux gebraeuchliche. In Java und anderen Programmiersprachen (mir faellt jetzt gerade noch go ein) gibt es auch Regexsupport und es wird immer die gleiche Syntax verwendet. Weiss nicht ob es so geschickt ist sich in den Icon Regex support einzuarbeiten :conf:

  • Hallo framp,

    es gibt in Icon eine Datei "regexp.icn" (in ipl/gprocs) zum Einbinden in eigene Projekte, die laut Beschreibung

    Zitat

    Procedure for regular-expression pattern matching

    enthält.

    Mit 831 Zeilen scheint das Ding auch recht mächtig zu sein.

    Ein Demo-Code befindet sich in /ipl/progs/igrep.icn.

    Das, was ich vorhin in Beitrag #75 gebracht habe, hat mit Regex so gar nichts zu tun. Das ist das "normale" String-Scanning von Icon.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    2 Mal editiert, zuletzt von Andreas (8. Januar 2021 um 22:10)

  • Das, was ich vorhin in Beitrag #75 gebracht habe, hat mit Regex so gar nichts zu tun. Das ist das "normale" String-Scanning von Icon.

    Das ist mir nicht so klar geworden. Ich kenne Icon nicht. War nur so mein Eindruck.

    Datei "regexp.icn" zum Einbinden

    Vermutlich wird dann die normale Regex Syntax zu benutzen sein. Du kannst ja mal versuchen damit die IP zu extrahieren. Dann haettest Du die Kombination aus Icon (was Du gut kennst) und Regex (was Du kennenlernen willst :))

  • So Frickellösungen kann man umgehen, in dem man die dafür vorgesehen Schnittstellen verwendet, statt externe Programme aufzurufen und deren Ausgabe zu parsen, auch wenn die dafür gar nicht vorgesehen sind. Im Falle von Interface-Name zu IPv4-Adresse wären das unter Linux die Funktionen `getifaddrs()`/`freeifaddrs()` und `getnameinfo()` aus der C-Bibliothek. Man muss dann schauen wie man das in die gewünschte Programmiersprache bekommt. Viele bieten eine „foreign functions interface“-API um C-Funktionen in Bibliotheken zur Laufzeit anzusprechen falls es nicht einfacher ist so etwas beim Compilieren in das eigene Programm zu ziehen.

    In Python könnte man sich beispielsweise wie folgt eine Funktion schreiben die Paare von Interfacname und IPv4-Adresse liefert:

    Icon bietet wohl auch eine Möglichkeit dynamisch eine C-Funktion aus einer Bibliothek zu laden, aber da müssen die C-Funktionen bestimmten Anforderungen genügen, so dass man nicht einfach irgendwelche C-Funktionen aufrufen kann. Da müsste man sich also eine kleine C-Bibliothek mit der Funktionalität schreiben, die man dann einbinden kann.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Hallo zusammen,

    Icon bietet wohl auch eine Möglichkeit dynamisch eine C-Funktion aus einer Bibliothek zu laden, aber da müssen die C-Funktionen bestimmten Anforderungen genügen, so dass man nicht einfach irgendwelche C-Funktionen aufrufen kann. Da müsste man sich also eine kleine C-Bibliothek mit der Funktionalität schreiben, die man dann einbinden kann.

    Mit bash ist da leider Essig :no_sad: Aber Icon kann das wohl ...

    Ja, ist in Icon relativ einfach. In den Tutorial-Teilen 30 wird die Verwendung von in C geschriebenen Libraries vorgestellt. In Teil 31 analog um in C++ geschriebene Libraries. Und im Teil 32 geht es um die Kommunikation von Icon (& Unicon) mit Code, der in D, Lazarus/FreePascal, Cobol, Prolog und ARM-Assembler.

    Allen gemeinsam ist, dass eine "fremdsprachige" Funktion seitens Icon dynamisch oder statisch geladen wird, Argumente ganz normal in die "fremdsprachige" Funktion übertragen werden. Da Icon keine richtigen Datentypen hat, muss dann in der "fremdsprachigen" Funktion angegeben werden, welchem Datentyp das in der "Fremdsprache" entspricht. Ńach Ablauf erfolgt dann eine Rückwandlung des Ergebnisses nach Icon, um das Ergebnis in Icon nutzen zu können.

    Werden keine Argumente übergeben, dann kann man sich da entsprechend Code sparen. Das Gleiche gilt dann auch für die Rückgabe von Ergebnissen.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!