PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : awk | regex - datei auslesen um weiter zu verarbeiten



tetex
24-03-2010, 12:31
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:


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:

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ß

msi
24-03-2010, 13:00
zB so:

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

tetex
24-03-2010, 13:35
zB so:

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

Super danke!

Leider funktioniert weder


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

noch


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.

msi
24-03-2010, 16:50
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



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

tetex
24-03-2010, 18:07
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



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


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

awk '/http:\/\/meinedomain.tld\/[.......]/ {print $1}' 24.03.2010.txt
oder vielleicht auch ein

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ß

msi
24-03-2010, 20:40
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.

tetex
24-03-2010, 21:46
Super Danke!

Mit folgender Zeile bekomme ich aber noch immer keine Ausgabe:


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

msi
24-03-2010, 21:59
Super Danke!

Mit folgender Zeile bekomme ich aber noch immer keine Ausgabe:


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:


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

tetex
25-03-2010, 08:05
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 :rolleyes:

Gruß