[BASH] Frickler-Pipes

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Warum so kompliziert?

    Bei mir reicht:

    Code
    ifconfig eth0 | awk '/inet / {print $2}'

    bei mir nicht, denn da kommt als Rückmeldung Adresse:192.168.2.119. Und dieser sprachenabhängige Teil müsste dann auch noch entfernt werden. ... Der vor dem Doppelpunkt ... Ähm ... :conf: ... krieg' ich hin ... irgendwie schon ... :denker: ... so:

    Code
    ifconfig wlan0 | awk '/inet / {print $2}' | cut -d':' -f2

    liefert dann die pure IP-Adresse.

    :danke_ATDE:, Tell !


    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.

  • Code
    ifconfig wlan0 | awk -F ' *|:' '/inet /{print $3}'

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Oder iproute2/ip:

    ip  -br -4 a s dev eth0|awk -F' *|/' '{print $3}'
    Das Ganze ist aber sehr wackelig, da "IPv4 vs IPv6", "mehrere IPs auf Iface" etc. bedacht sein müssen bzw nicht geprüft werden.

    Wenn du nichts zu sagen hast, sag einfach nichts.

    2 Mal editiert, zuletzt von llutz (7. Januar 2021 um 10:32)

  • Und dieser sprachenabhängige Teil müsste dann auch noch entfernt werden. ... Der vor dem Doppelpunkt ... Ähm ... :conf: ... krieg' ich hin ... irgendwie schon ... :denker: ... so:

    Ich nutze lieber iproute2 und Python.

    Mit iproute2 gebe ich dann vor, was ich an Adressen will.

    Code
    ip a s lo

    Um spezifischer zu werden, kann man das weiter eingrenzen z.B. auf ipv4.

    Code
    ip -4 a s lo
    Zitat

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    inet 127.0.0.1/8 scope host lo

    valid_lft forever preferred_lft forever

    Um die Ausgabe vernünftig verarbeiten zu können, bietet sich JSON an.

    Code
    ip -4 -j a s lo
    Zitat

    [{"ifindex":1,"ifname":"lo","flags":["LOOPBACK","UP","LOWER_UP"],"mtu":65536,"qdisc":"noqueue","operstate":"UNKNOWN","group":"default","txqlen":1000,"addr_info":[{"family":"inet","local":"127.0.0.1","prefixlen":8,"scope":"host","label":"lo","valid_life_time":4294967295,"preferred_life_time":4294967295}]},{},{},{}]

    Um es für Menschen besser lesbar zu machen:

    Code
    ip -4 -j -p a s lo

    Es ist einfacher strukturierte Daten zu parsen, als unstrukturierte Daten, die auch noch Sprachabhängig sein können.

    Die Ausgabe kann man das in das kleine Python-Programm pipe (läuft leider auch mit Python2) um dann ausschließlich die IP-Adressen auszugeben.

    Sieht dann so aus:

    Code
    ip -4 -j a s lo | python get_ip.py
    Zitat

    127.0.0.1

    IPv6 gefällig?

    Code
    ip -6 -j a s lo | python3 get_ip.py
    Zitat

    ::1

    Gewöhnt euch schonmal an iproute2, denn ifconfig wird es nicht mehr so lange geben.

    Eigentlich sollte das schon lange gestorben sein, aber Debian und Co. sind da sehr traditionell.

  • Hallo Tell,


    Das cut bringe ich auch noch weg :)

    Wie sieht die Ausgabe von ifconfig auf diesem System aus?

    Code
    ifconfig

    liefert

    (ETH0 ist nicht angeschlossen)

    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.

  • Der Ansatz von Der_Imperator gefaellt mir eigentlich, nur bekomme ich immer ein leeres Feld in $1.

    Mit dem Imperator-Ansatz laeuft es bei mir so:

    Code
    cat input | awk -F ' *|:' '/inet / {print $4}'

    Woher das leere Feld kommt habe ich bisher nicht herausgefunden :conf:


    Ein anderer Ansatz ist sub(). Das koennte robuster sein als die Zeile oben:

    Code
    cat input | awk '/inet / { sub(/.*:/,"",$2); print $2 }'

    Um die Vermutung zur Robustheit zu bestaetigen braucht es eine groessere Testreihe auf moeglichst vielen Systemen...

  • Hallo Imparator,

    Code
    ifconfig wlan0 | awk -F ' *|:' '/inet /{print $3}'

    liefert bei mir (Ubuntu)

    Code
    Adresse


    Funktioniert bei mir nur mit 3 ==> 4:

    Code
    ifconfig wlan0 | awk -F ' *|:' '/inet /{print $4}'
    192.168.2.119

    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 framp,

    liefert das richtige Ergebnis - nur ist der Ausschnitt

    Code
    ":([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}"

    (mir) nicht richtig eingängig... :conf::conf::conf:. Aber es funktioniert... :auslachen::conf::conf::conf:.

    Sieht für mich wie RegExp aus - das, wo ich immer einen großen Bogen herum gemacht habe.

    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.

  • Ja, das ist ein Regex. Ich mag die im Gegensatz zu Dir ;). Er sagt suche mir einen Text der mit : beginnt und dann von einer IP Adresse gefolgt wird. Etwas allgemeiner waere noch

    Code
    ifconfig wlan0 | grep -o -E ":([[:space:]])*([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}" | head -n 1 | tr -d :

    wo noch Leerzeichen zwischen : und der IP Adresse erlaubt sind.

  • Code
    wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 192.168.100.10  netmask 255.255.255.0  broadcast 192.168.100.255
    inet6 fd00::3682:69c2:2be6:411b  prefixlen 64  scopeid 0x0<global>
    inet6 fe80::c9f1:e93b:e8f4:9569  prefixlen 64  scopeid 0x20<link>
    ether dc:a6:32:12:19:2a  txqueuelen 1000  (Ethernet)
    RX packets 38798  bytes 2473187 (2.3 MiB)
    RX errors 0  dropped 4  overruns 0  frame 0
    TX packets 1009  bytes 131624 (128.5 KiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    Das.

    Gruss

  • Seufz ... die Ausgaben sehen leider immer etwas anders aus je nachdem auf welcher Distro man sich bewegt. Bei Dir fehlt das :.

    Code
    ifconfig wlan0 | grep -o -E ":?([[:space:]])*([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}" | head -n 1 | tr -d :

    sollte jetzt sowohl fuer Andreas als auch Dich funktionieren.

  • Hallo framp,

    Seufz ... die Ausgaben sehen leider immer etwas anders aus je nachdem auf welcher Distro man sich bewegt. Bei Dir fehlt das :.

    Code
    ifconfig wlan0 | grep -o -E ":?([[:space:]])*([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}" | head -n 1 | tr -d :

    sollte jetzt sowohl fuer Andreas als auch Dich funktionieren.

    jau... funzt.

    Das macht die Sache aber problematisch, wenn man auf einem Distro-OS entwickelt & testet und optimiert, für ein anderes vorhandenes Distro-OS noch testen & anpassen kann ... und alle anderen Distro-OSse nur Bahnhof verstehen.

    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,

    dann habe ich den Thread vor über 5 Jahren ja fast schon mit prophetischen Fähigkeiten richtig getauft: "Frickler-Pipes"

    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.

  • Das macht die Sache aber problematisch, wenn man auf einem Distro-OS entwickelt & testet und optimiert, für ein anderes vorhandenes Distro-OS noch testen & anpassen kann ... und alle anderen Distro-OSse nur Bahnhof verstehen.

    Das Ganze ist immer ein gefrickel. Auch #44 und #45. Wenn ich da den String inet sehe und an I18N denke wo der String ganz anders aussieht hast Du nur Probleme. Am sichersten ist noch wenn Du gegen ein stabiles API gehst. Jegliche Formatierung der API Ausgaben sicher zu parsen ist nahezu unmoeglich.

    Im konkreten Fall finde ich das Parsen nach dem Format einer IP Adresse schon mal ziemlich sicher. Man muss nur die richtige erwischen (nicht die Bcast IP oder die Netmask die ja alle dasselbe Format haben) Nur nach irgendwelchen unspezifischen Texten an einer bestimmten n-ten Position zu parsen ist fuer mich zu unzuverlaessig.

Jetzt mitmachen!

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