deepspace_9 Geschrieben 17. Februar 2005 Teilen Geschrieben 17. Februar 2005 Hallo Kollegen, habe schon des öfteren ein Problem gehabt, konnte mich aber irgendwie immer selbst raus retten, über Umwege oder zusätzliche Scripte Jetzt reicht es mir, da muss eine andere Lösung her, also eventuell könnt Ihr mir ja helfen: Es geht um folgenden String, der automatisiert zu analysieren ist: >>>" Feb 16 23:43:37 linux kernel: --- Networkalert!!! --- IN=eth0 OUT= MAC=ff:ff:ff:ff:ff:ff:00:ff:ff:6f:69:8d:08:ff SRC=192.168.2.155 DST=192.168.0.255 LEN=229 TOS=0x00 PREC=0x00 TTL=128 ID=22974 PROTO=UDP SPT=138 DPT=138 LEN=209 "<<< Die String-Länge, genauso wie die Anzahl der durch "Leer" getrennten Felder können variieren, folglich ist der Einsatz von cut und gawk nur über Umwege und bedingt möglich. wenn ich z.B. genau den Teil mit "linux kernel: --- Networkalert!!! ---" ausschneiden will, sprich dass der Rest nacher z.B. in einer Variable steht.... Mit Sed ist mir noch keine Idee gekommen, aber eventuell sitze ich ja nur auf dem Schlauch. :confused: Habt Ihr eine Idee? Besten Dank im Vorraus. Grüße, deepspace_9 ------------------------ PS: Damit keine Missverständnisse auftauchen: String vorher: Feb 16 23:43:37 linux kernel: --- Networkalert!!! --- IN=eth0 OUT= MAC=ff:ff:ff:ff:ff:ff:00:ff:ff:6f:69:8d:08:ff SRC=192.168.2.155 DST=192.168.0.255 LEN=229 TOS=0x00 PREC=0x00 TTL=128 ID=22974 PROTO=UDP SPT=138 DPT=138 LEN=209 String nachher: Feb 16 23:43:37 linux kernel: IN=eth0 OUT= MAC=ff:ff:ff:ff:ff:ff:00:ff:ff:6f:69:8d:08:ff SRC=192.168.2.155 DST=192.168.0.255 LEN=229 TOS=0x00 PREC=0x00 TTL=128 ID=22974 PROTO=UDP SPT=138 DPT=138 LEN=209 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
deepspace_9 Geschrieben 17. Februar 2005 Autor Teilen Geschrieben 17. Februar 2005 ... habe ich gefunden, ist ja schon mal ein Anfang (zumindest für variable Feldanzahl hinten, aber eben nicht vorn) cut -d\ -f1,2,3,8- wäre eine Lösung dafür. Aber was mache ich, wenn zum Bsp. (aus welchen Gründen auch immer) die Feldanzahl vor dem zu löschenden String sich ändert... z.B.: Feb 16 23:43:37 --- Networkalert!!! --- IN=eth0 OUT= MAC=ff:ff:ff:ff:ff:ff:00:ff:ff:6f:69:8d:08:ff SRC=192.168.2.155 DST=192.168.0.255 LEN=229 TOS=0x00 PREC=0x00 TTL=128 ID=22974 PROTO=UDP SPT=138 DPT=138 LEN=209 Dann schliesst logischerweise ein "cut -d\ -f1,2,3,8-" nicht mehr "linux kernel: --- Networkalert!!! ---" aus, sondern " --- Networkalert!!! --- IN=eth0 OUT=" was ja NICHT gewünscht ist! Also, habt ihr noch eine weitere Idee? thanks and greets... :floet: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
deepspace_9 Geschrieben 17. Februar 2005 Autor Teilen Geschrieben 17. Februar 2005 Hallo :cool: Keiner eine Idee? Oder keine Lust? :confused: Am :schlaf: seid Ihr ja nicht unbedingt.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schlaubi Geschrieben 17. Februar 2005 Teilen Geschrieben 17. Februar 2005 Meinst du sowas hier: echo 'Feb 16 23:43:37 linux kernel: --- Networkalert!!! --- IN=eth0 OUT= MAC=ff:ff:ff:ff:ff:ff:00:ff:ff:6f:69:8d:08:ff SRC=192.168.2.155 DST=192.168.0.255 LEN=229 TOS=0x00 PREC=0x00 TTL=128 ID=22974 PROTO=UDP SPT=138 DPT=138 LEN=209' | sed 's#--- Networkalert!!! --- ##g' Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 17. Februar 2005 Teilen Geschrieben 17. Februar 2005 Hallo, wenn es so komplex wird, musst du mehrere Versionen schreiben. Sobald diese Daten nicht nach einer festen Struktur aufgebaut sind, nutzen solche Tools wie sed und awk recht wenig. Du müsstest praktisch zuerst mal alle Möglichkeiten herausfinden, also wie viele Spalten, Zeichen und Worte vor der Stelle stehen können, die du herausfiltern möchtest. Logdateien sind ja i.d.R. immer nach einem bestimmten Schemau aufgebaut, und das müsstest du erstmal herausbekommen. Danach kannst du entweder einen Algorithmus zum Filtern schreiben, oder eben mehrere Versionen, eine für lange und kurze Logdateien, eine für Version 2 und Version 2.1 etc. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Anday Geschrieben 17. Februar 2005 Teilen Geschrieben 17. Februar 2005 Vielleicht solltest du dir SED nochmal genauer anschauen. Damit kannst du z.B. in deinem String nach bestimmten Schlüsselwörtern/-zeichen suchen, nach denen die Information steht, die du löschen, speichern oder was auch immer willst. Ähnlich wie schlaubi vorgeschlagen hat, könntest du alle Informationen, die du Brauchst aus dem String extrahieren und gesondert darstellen oder so. Willst du z.B. alles, was vor der MAC-Adresse kommt bearbeiten, benutzt du "^.*MAC=" (übersetzt: Zeilenanfang bis "MAC=") Jetzt könntest du also auch alles, was nach der MAC-Adresse kommt löschen und das Ergebnis, das in diesem Fall nur aus der MAC bestünde, in einer Variablen oder einer Datei speichern. Sicherlich, ist es nicht leicht, sich SED selbst ausführlich beizubringen, aber es lohnt sich. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 17. Februar 2005 Teilen Geschrieben 17. Februar 2005 Hallo, so wie ich das verstehe, handelt es sich eben nicht um bestimmte Zeichenketten, denn das wäre ja kein Problem. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
deepspace_9 Geschrieben 17. Februar 2005 Autor Teilen Geschrieben 17. Februar 2005 :marine Meinst du sowas hier: echo 'Feb 16 23:43:37 linux kernel: --- Networkalert!!! --- IN=eth0 OUT= MAC=ff:ff:ff:ff:ff:ff:00:ff:ff:6f:69:8d:08:ff SRC=192.168.2.155 DST=192.168.0.255 LEN=229 TOS=0x00 PREC=0x00 TTL=128 ID=22974 PROTO=UDP SPT=138 DPT=138 LEN=209' | sed 's#--- Networkalert!!! --- ##g' :uli Na, das war doch genau das, was ich eigendlich suchte... Ich war zu blöde das mit sed hinzubekommen. Vielen Dank. Gruß, deepspace_9 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
deepspace_9 Geschrieben 17. Februar 2005 Autor Teilen Geschrieben 17. Februar 2005 Hallo, so wie ich das verstehe, handelt es sich eben nicht um bestimmte Zeichenketten, denn das wäre ja kein Problem. Ok, eventuell habe ich mich doch missverständlich ausgedrückt Ich meinte schon ein festes String, aber eben aus einer variablen Zeichekette, eben nicht an 8. Stelle, oder so.... Auch wenn es einfach war, ich stehe mit den seds und awks mit ihren rationelen Ausdrücken ein wenig auf Kriegsfuss. Naja, bislang habe ich es auch meistens irgendwie, irgendwann hinbekommen.... Trotzdem, an alle: :uli Vielen Dank für Eure Hilfe. Besten Grüße, Deepspace_9 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schlaubi Geschrieben 18. Februar 2005 Teilen Geschrieben 18. Februar 2005 Moin, eventuell habe ich mich doch missverständlich ausgedrückt Ich meinte schon ein festes String, aber eben aus einer variablen Zeichekette, eben nicht an 8. Stelle, oder so.... du hast dich definitiv falsch ausgedrückt und tust es gerade wieder. Zeichenkette ist die deutsche Übersetzung für String. Was sind feste Strings? :nett: Was du sicherlich sagen wolltest ist, dass du eine(n) String/Zeichenkette hast, nämlich: Feb 16 23:43:37 --- Networkalert!!! --- IN=eth0 OUT= MAC=ff:ff:ff:ff:ff:ff:00:ff:ff:6f:69:8d:08:ff...... Und du möchtest jetzt aus diesem nach eine[mr] bestimmten String/Zeichenkette, nämlich "--- Networkalert !!! --- " suchen, egal an welcher Stelle sich diese Zeichenkette befindet und diese anschließend aus dem originalen String: Feb 16 23:43:37 --- Networkalert!!! --- IN=eth0 OUT= MAC=ff:ff:ff:ff:ff:ff:00:ff:ff:6f:69:8d:08:ff...... herauslöschen bzw. durch ein Blank ersetzen. Da es sich um einen gleichbleibenden String handelt, jedoch die Position an der er zu finden ist variiert, benötigst du lediglich "--- Networkalert !!! --- " als Suchmuster. Wenn du z.B. nach "--- Networkalert !!! --- " und "- - - NetworkAlert - - -" suchen willst und mit einem sed-Aufruf beide Fälle durch ein blank ersetzen möchtest, musst du auf 'Regular Expressions' (regexp) zurückgreifen und dein Suchmuster (regexp) auf den String anwenden. seds und awks mit ihren rationelen Ausdrücken Wie bereits oben erwähnt - es heißt regulärer Ausdruck, rationelle Ausdrücke gibt es nicht. Mein Chef macht zwar einen rationellen Eindruck, aber das ist eine andere Geschichte. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.