[geloest] In bash string extrahieren

  • Yohoo!


    Braeuchte mal hier Hilfe.


    Und zwar moechte ich einen String aus einer Textausgabe extrahieren. Die Textausgabe steht mir in zwei Varianten zure Verfuegung, ich bin aber bei keiner weiter gekommen.


    Also, Variante1:

    Code
    Virtual Machine Network0        1           vmnic1


    Oder Variante2:

    Code
    |----Portgroup Name...................Virtual Machine Network


    Was ich brauche ist der String "Virtual Machine Network". Ich habe mit cut und awk gespielt, bin aber nicht wirklich weiter gekommen.


    Das Bloede daran ist ja, dass der obige String auch voellig anders aussehen kann, z.B. "VM Network" oder "DHCPNW" oder sonstwas. Kann also ein oder mehr Leerzeichen enthalten.


    Jemand eine Idee, wie man das mit der bash hinkriegt?


    Und nein, Perl steht nicht zur Verfuegung.


    Danke fuer Tipps!

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

    Einmal editiert, zuletzt von knebb ()

  • Zitat

    Originally posted by hvkls
    sed -e 's/^.*\(Virtual Machine Network\).*$/\1/'


    Oder habe ich da was falsch verstanden?


    Ja, weil ich eben nicht weiss, wie der String genau heisst, den ich suche. Wenn der immer "Virtual Machine Network" heissen wuerde, waere ich auch gluecklich. Der kann aber, wie geschrieben, auch anders aussehen. Und da ich nicht weiss wie, klann ich ihn schlecht in eine sed Expression reinbringen :)

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Zitat

    Originally posted by hvkls
    Da fallen mir spontan drei Moeglichkeiten ein: natuerliche Intelligenz, kuenstliche Intelligenz oder die Angabe moeglicher Zielzeichenketten.


    Du wirst sicherlich verstehen, dass das nicht die Antwort ist, nach der ich gesucht habe. :(


    Muss doch irgendwie moeglich sein, anhand des letzten einer Reihe von "." einen Trenner einzufuegen, oder? Und mit dem Trenner kann man dann gut mit cut arbeiten.

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • mit awk fast nen 2 Zeiler:)


    Code
    awk '{
        if (match($0, "^([^0]+)0|\\.([^.]+)$", a))
            print a[1] a[2] 
    }' << !
    Virtual Machine Network0        1           vmnic1
                                  |----Portgroup Name...................Virtual Machine Network
    !


    ergibt


    Code
    Virtual Machine Network
    Virtual Machine Network
  • Zitat

    Originally posted by sparkie
    mit awk fast nen 2 Zeiler:)


    Jo, klappt nur nicht wie gewuenscht.


    Beim ersten Textblock kriege ich die Whitespaces am Anfang mit.
    Und beim zweiten kriege ich kein Ergebnis.


    Nicht, dass ich den AWK Code verstehen koennte, aber klappen tut das so nicht. Die Strings oben sollten so im Portal stehen, wie sie original sind, inkl. Spaces.


    Probiere die anderen Sachen mal aus.

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Zitat

    Originally posted by wirbel

    Bash
    #!/bin/bash


    Das scheint erst mal zu funktionieren. Aber so wie ich das verstehe, basiert das darauf, dass exakt 30 "." dazwischen sind, oder?


    Hmmm...da bin ich mir jetzt nicht sicher ob das bei meinem Programm immer der Fall ist oder ob das auch mal 29 oder 31 sind....

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

    Einmal editiert, zuletzt von knebb ()

  • Zitat

    Originally posted by knebb


    Jo, klappt nur nicht wie gewuenscht.


    also du kannst den Code oben sogar per cut&paste direkt in deine Shell kippen


    und es sollte genau 2x der gewuenschte String raus kommen.


    "Virtual Machine Network" sollte es doch sein oder?


    wichtig ist allerdings dass du den 'gawk' verwendest (also auf debian z.B. /etc/alternatives/awk -> /usr/bin/gawk)

  • Zitat

    Originally posted by sparkie
    also du kannst den Code oben sogar per cut&paste direkt in deine Shell kippen


    Klar. Auch probiert.

    Zitat


    und es sollte genau 2x der gewuenschte String raus kommen.


    Eben nicht. Selbst mit c&p kommt das nur einmal raus (und auch ohne Whitespaces, weil die in Deinem Code nicht drinnen sind). Die zweite Zeile fehlt.


    Zitat

    "Virtual Machine Network" sollte es doch sein oder?


    Ja, ohne Whitespaces und ohne Trailingspaces.

    Zitat


    wichtig ist allerdings dass du den 'gawk' verwendest (also auf debian z.B. /etc/alternatives/awk -> /usr/bin/gawk)

    Code
    $ ls -l /bin/awk
    lrwxrwxrwx    1 root     root            4 Dec 22 11:32 /bin/awk -> gawk

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Zitat

    Original von knebb


    Das scheint erst mal zu funktionieren. Aber so wie ich das verstehe, basiert das darauf, dass exakt 30 "." dazwischen sind, oder?


    Hmmm...da bin ich mir jetzt nicht sicher ob das bei meinem Programm immer der Fall ist oder ob das auch mal 29 oder 31 sind....


    Nein, dieser loop fasst bis zu 30mal ein '--' zu '-' sowie '..' zu '.' zusammen. Weniger ist immer okay.

  • Zitat

    Originally posted by wirbel
    Nein, dieser loop fasst bis zu 30mal ein '--' zu '-' sowie '..' zu '.' zusammen. Weniger ist immer okay.


    Alles klar. Habe sicherheitshalber mal ein "50" reingesetzt ;)


    Danke, damit geht's jetzt!

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • also sorry ich kapier's ned, was da nicht funktionieren soll.


    Ich habe jetzt extra zur Verdeutlichung noch '<' '>' eingebaut um zu zeigen, dass weder leading noch trailing Spaces drin sind. Zusaetzlich hab ich alle Spaces aus dem Ausgabestring wie gewuenscht entfernt:)



    Code
    awk ' {
        if (match($0, "^([^0]+)0|\\.([^.]+)$", a))
            print "<" gensub(" ", "", "g", (a[1] a[2])) ">"
    }' << !
    VM Network0        1           vmnic1
    Virtual Machine Network0        1           vmnic1
                                  |----Portgroup Name...................Virtual Machine Network
                                  |----Portgroup Name...................DHCPNW
    !


    ergibt


    Code
    <VMNetwork>
    <VirtualMachineNetwork>
    <VirtualMachineNetwork>
    <DHCPNW>
  • Zitat

    Originally posted by sparkie
    also sorry ich kapier's ned, was da nicht funktionieren soll.


    Ich weiss auch nicht, was bei Deiner Loesung falsch ist.
    Fakt ist, wenn ich es mit Cut&Paste aus dem Browser via PuTTy in meine Console kopiere kommat das Folgende raus:


    Aber die andere Variante von Wirbel funktioniert- und die verstehe ich auch eher ;D

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

  • Zitat

    Original von knebb
    Aber die andere Variante von Wirbel funktioniert- und die verstehe ich auch eher ;D


    STR=${STR/*..}
    STR=${STR/0*}
    echo $STR


    tut auch mit allen genannten Beispielen und ist recht überschaubar. Braucht kein perl, kein awk, kein sed, kein cut.


    Christian

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!