Anzeige:
Ergebnis 1 bis 9 von 9

Thema: awk | regex - datei auslesen um weiter zu verarbeiten

  1. #1
    Registrierter Benutzer
    Registriert seit
    30.01.2010
    Beiträge
    21

    awk | regex - datei auslesen um weiter zu verarbeiten

    Hallo,

    ich habe eine Textdatei mit Links die von meinem System täglich erstellt werden. Zudem sind dort noch weitere Hinweise mit Link für die Administration enthalten.

    Ich möchte aber nur die Links aus dem Abschnitt "LINKS:" heraus nehmen und in eine neue Datei schreiben/gesondert ablegen.

    Die TXT sieht so aus:

    Code:
    LINKS:
    http://meinedomain.tld/9seqe1
    http://meinedomain.tld/o1cx5z
    http://meinedomain.tld/9857bx
    
    ADMIN:
    http://meinedomain.tld/9seqe18nrzpc3kuqdw5cyperdm93eksu
    http://meinedomain.tld/o1chu11c1dvx14sx5zv8hnln4iko5qa2
    http://meinedomain.tld/98djojlmixomwsup14qvp57bxu6nte3x

    Mit dieser Zeile:
    Code:
    awk '/http:\/\/meinedomain.tld\// {print $1}' 24.03.2010.txt
    Bekomme ich schon mal eine Rückgabe aber natürlich alle 6 Links.

    Kann mir jemand sagen wie ich nur die Links aus "LINKS:" bekomme?

    Gruß

  2. #2
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    zB so:

    perl -ne '$k=$1 if /^([A-Z]+):\s*/; print if $k eq "LINKS" and /^http:/;'
    Geändert von msi (24-03-2010 um 14:02 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    30.01.2010
    Beiträge
    21
    Zitat Zitat von msi Beitrag anzeigen
    zB so:

    perl -ne '$k=$1 if /^([A-Z]+):\s*/; print if $k eq "LINKS" and /^http:/;'
    Super danke!

    Leider funktioniert weder

    Code:
    perl -ne '$k=$1 if /^([A-Z]+):\s*/; print if $k eq "LINKS" and /^http:/;' 24.03.2010.txt
    noch

    Code:
    cat 24.03.2010.txt | perl -ne '$k=$1 if /^([A-Z]+):\s*/; print if $k eq "LINKS" and /^http:/;'
    Führt zu beide male zu keiner Ausgabe.
    Geändert von tetex (24-03-2010 um 14:37 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    wenn die datei noch mehr leerzeichen enthält musst du den perl
    ausdruck natürlich noch anpassen.

    Ich habe das ganze mit einer Datei getestet, die genauso aussieht wie du
    im Quote vermerkt hast (also keine leerzeichen usw)


    hiermit kannst dus auch versuchen, ist vllt leichter zu verstehen

    Code:
    perl -ne '(/^\s*([A-Z]+):/ and $k=$1) or ($k eq "LINKS" and /http:/ and print)'
    Geändert von msi (24-03-2010 um 18:01 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    30.01.2010
    Beiträge
    21
    Zitat Zitat von msi Beitrag anzeigen
    wenn die datei noch mehr leerzeichen enthält musst du den perl
    ausdruck natürlich noch anpassen.

    Ich habe das ganze mit einer Datei getestet, die genauso aussieht wie du
    im Quote vermerkt hast (also keine leerzeichen usw)


    hiermit kannst dus auch versuchen, ist vllt leichter zu verstehen

    Code:
    perl -ne '(/^\s*([A-Z]+):/ and $k=$1) or ($k eq "LINKS" and /http:/ and print)'
    Ok. Danke. Einen Gefallen hätte ich noch. Zwar ist es leicht einfach nur zu Fragen ... aber viel lieber würde ich auch wissen was die Zeile in Worten übersetzt zu bedeuten hat. So habe ich für die Zukunft auch was gelernt und nicht einfach copy&paste betrieben

    Und weil du gerade meinst wegen den Zeilenabständen...

    GANZ genau sieht meine Datei so aus

    Code:
    SEITE:
    
    http://meinedomain.tld/xyz.html
    http://meinedomain.tld/xyz2.html
    http://meinedomain.tld/asf.html
    
    
    LINKS:
    
    http://meinedomain.tld/9seqe1
    http://meinedomain.tld/o1cx5z
    http://meinedomain.tld/9857bx
    
    
    ADMIN:
    
    http://meinedomain.tld/9seqe18nrzpc3kuqdw5cyperdm93eksu
    http://meinedomain.tld/o1chu11c1dvx14sx5zv8hnln4iko5qa2
    http://meinedomain.tld/98djojlmixomwsup14qvp57bxu6nte3x
    Wäre es nicht besser man würde direkt auf die 6 Zeichen am Ende der Links von LINKS eingehen anstatt man das ganze File anhand von Zeilenabständen durchsucht? Denn es können auch an jeder stelle mal 10 oder 100 Links stehen und dann passt das ganze wieder nicht mehr oder?

    Wie z.B. [.......] für 7 variable Zeichen (können auch 10 Zeichen sein. Es wird sonst nie irgendwo vorkommen, dass bei den LINKS mehr als 10 Zeichen nach den Slash stehen) ... habe ich irgendwo auf einer Seite gefunden nur funktioniert das nicht ... also
    Code:
    awk '/http:\/\/meinedomain.tld\/[.......]/ {print $1}' 24.03.2010.txt
    oder vielleicht auch ein
    Code:
    awk '/http:\/\/meinedomain.tld\/[A-Z][a-z]/ {print $1}' 24.03.2010.txt
    oder so ... bin mir regex absolut garnicht vertraut und auch das "schnelle einlesen" funktioniert hier nicht

    Danke. Gruß
    Geändert von tetex (24-03-2010 um 19:18 Uhr)

  6. #6
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    was ich dir vorher geschrieben hab funktioniert in deinem fall auch.

    das problem was ich im 2. post gemeint habe (leerzeichen war nur, dass vor dem
    http:// ja auch ein Leerzeichen stheen könnte. das kannst du mit \s* matchen oder halt direkt einen link mit http identifizieren.


    perl -ne '(/^\s*([A-Z]+):/ and $k=$1) or ($k eq "LINKS" and /http:/ and print)'


    perl -ne parameter siehe manpage von perl

    jetzt geh ich auf die einzelnen befehle ein:
    /^\s*([A-Z]+):/

    das ist ein regulärer ausdruk, der auf jede zeile deiner eingabedatei angewendet wird. der matcht also die überschriften (LINKS: ADMIN: usw)

    $k=$1

    hier wird dann das LINKS bzw ADMIN in die variable $k gespeichert


    $k eq "LINKS"

    sollte klar sein...

    /http:/

    regulrärer ausdruck: kommt http: in der zeile vor

    print

    gibt die zeile aus

    und die ganzen answeisungen sind natürlich mit und bzw oder verknüpft, das kannst du hoffent6lich selber nachvollziehen. Die klammerung gehört auch zur logik.



    also

    (/^\s*([A-Z]+):/ and $k=$1) or ($k eq "LINKS" and /http:/ and print)

    in prosa wäre

    (matcht eine Zeilenüberschrift, dann schreib die Zeilenüberschrift in $k)
    ANSONSTEN
    (in $k steht "LINKS" und die aktuelle zeile matcht http:, dann gib sie aus)

    alles klar?


    außerdem empfehle ich dir kein awk oder sed zu lernen und stattdessen lieber
    perl zu verwenden. Perl ist um einiges mächtiger.
    Geändert von msi (24-03-2010 um 21:46 Uhr)

  7. #7
    Registrierter Benutzer
    Registriert seit
    30.01.2010
    Beiträge
    21
    Super Danke!

    Mit folgender Zeile bekomme ich aber noch immer keine Ausgabe:

    Code:
    perl -ne '(/^\s*([A-Z]+):/ and $k=$1) or ($k eq "LINKS" and /http:/ and print)' 24.03.2010.txt

  8. #8
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Zitat Zitat von tetex Beitrag anzeigen
    Super Danke!

    Mit folgender Zeile bekomme ich aber noch immer keine Ausgabe:

    Code:
    perl -ne '(/^\s*([A-Z]+):/ and $k=$1) or ($k eq "LINKS" and /http:/ and print)' 24.03.2010.txt

    scheinbar ist dann deine datei doch nicht genau so wie oben gepostet, denn damit gehts bei mir.
    du musst wahrsch die reg. ausdrücke noch anpassen.
    kannst ja einfach mal so umbauen:

    Code:
    perl -ne '(/^\s*([A-Z]+):/ and $k=$1) or ($k eq "LINKS" and /http:/ and print);  print "$k - $_"; ' 24.03.2010.txt
    dann siehst du welchen link er welchem bereich zuordnet, musst halt schaue nwelcher reg. ausdruck das problem ist
    Geändert von msi (24-03-2010 um 23:05 Uhr)

  9. #9
    Registrierter Benutzer
    Registriert seit
    30.01.2010
    Beiträge
    21
    Das Textfile ist genau so aufgebaut. Habs jetzt nochmal probiert aber es funktioniert nicht. Ehrlich gesagt hab ich auch schon die Schnauze wieder gestrichen voll. Hab ein PHP Entwickler ein kleines Script schreiben lassen, dass ich via PHP aufrufen lasse und das mir selbes Resultat liefert.

    Ist zwar nicht so schön wie über einen einfachen Kommandozeilenbefehl aber wenns nicht geht, gehts halt nicht!

    Danke dir dennoch vielmals

    Gruß

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •