Zum Inhalt springen

Text ausschneiden, wie ???


deepspace_9

Empfohlene Beiträge

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. :D

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

... 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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

: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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...