PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : grep, sed oder was?!



poi
18-07-2004, 18:13
Hallo,
ich bin auf meiner Suche nach einem Forum in dem ich meine Fragen stellen kann auf dieses hier gestossen. Nun habe ich mich angemeldet und versuche mal mein Glück.

Mein Problem:
Ich versuche das in 2 Stufen zu beschreiben, damit ich das besser begreife.
Ich habe Informationen mehrere Dateien mit grep auflisten lassen. In diesen Dateien habe ich Informationen zusammengetragen.

Die Auflistung sieht dann so aus:
2S5DR85W2R6 [Irgendwelche Infos] [Weitere Infos]
W25DRS852R6 [Irgendwelche Infos] [Weitere Infos]
S5D2R85W2R6 [Irgendwelche Infos] [Weitere Infos]

Diese Daten stehen in einer weiteren .tmp-Datei. Diesen 11'er-Block möchte ich nun so verändern (sed?), dass ich zu allererst eine feste Pfadangabe davor bekomme /var/log/ , dann jeweils hinder dem ersten und dem zweiten Buchstaben des 11'er-Blocks ein slash steht, dann der 11'er-Block dahinter:

/var/log/2/S/2S5DR85W2R6 [Irgendwelche Infos] [Weitere Infos]
/var/log/W/2/W25DRS852R6 [Irgendwelche Infos] [Weitere Infos]
/var/log/S/5/S5D2R85W2R6 [Irgendwelche Infos] [Weitere Infos]

Jetzt muss nur noch alles was hinter dem 11'er-Block steht gelöscht werden.

/var/log/2/S/2S5DR85W2R6
/var/log/W/2/W25DRS852R6
/var/log/S/5/S5D2R85W2R6

Das ist der erste Teil. Den 2. schaffe ich dann bestimmt selber, mal schauen.

Wie stelle ich das an?! Die regulären Ausdrücke kenne ich schon ein wenig, nur mit der richtigen Anwendung komme ich noch nicht klar. :confused:

Danke!

Badsteve
18-07-2004, 19:17
ich glaub du suchst sowas:



perl -pe 's/((.?)(.?).+?) \[.*$/\/var\/log\/$2\/$3\/$1 /' test.txt


der Ausdruck is zwar kein Meisterstück, aber er funktioniert bei mir! Es wir auf stdout ausgegeben.

steve

poi
18-07-2004, 21:30
ich glaub du suchst sowas:



perl -pe 's/((.?)(.?).+?) \[.*$/\/var\/log\/$2\/$3\/$1 /' test.txt


Bei mir kommen die Zeilen immernoch unbehandelt heraus.

Verstehe ich das Script richtig?

1. (.?) = $2 (irgendein 1. Zeichen)
2. (.?) = $3 (irgendein 2. Zeichen)
3. .+? = $1 (nur irgendein Wort am Anfang der Zeile bis zum 1. Leerzeichen)

Ist dann die Ausgabe nicht verdreht?! Muss ich nochmal Buch lesen. Aber da ist eine "[" ohne "]"?! Absicht? Aus logischer Sicht würde das nicht hinhauen... :confused:

Danke!

Badsteve
18-07-2004, 22:07
Die ersten beiden Fragezeichen kannst du weglassen. (Ich weiß auch nicht, wo die herkommen) In $1 landet dann das erste "Wort", bis zum Leerzeichen. In $2 das erste Zeichen und in $3 das erste Zeichen. Die Namensgebung hat was damit zu in welcher Reihenfolge die Klammern geöffnet werden.
Die "[" ist nur als Absicherung dazu, dass .* nicht zuviel matcht. Ich sehe aber erade, dass man das auch weglassen kann. Die Ausgabe ist nicht verdreht. Und bei mir funktioniert das auch.


perl -pe 's/((.)(.).+?) .*/\/var\/log\/$2\/$3\/$1/'

Daten entweder mit einer Pipe übergeben, oder wie oben das datei.
Hab leider keine Zeit.

steve

poi
19-07-2004, 07:23
perl -pe 's/((.)(.).+?) .*/\/var\/log\/$2\/$3\/$1/'

Cooooooooooooooooooo.!

Das klappt! Ich werde mir die Sequenz ganz genau unter die Lupe nehmen. Mal schauen, ob ich nun allein weiterkomme. Ansonsten rufe ich nochmal.

Fetten Dank!! :D