Dateiinhalt per script anpassen

Z

zirkuskater

Grünschnabel
Hallo,

ich sitze vor folgendem Problem.

Ich habe von einem Router die ARP-Einträge gelesen. Als Ergebnis stehen in
der Datei:arplist folgende Zeilen

0000f4b21ba1 168.6.232.1004776 1126257685
0000f4b482b1 168.6.13.1004778 1126257685
...
...
usw.

Nach der Bearbeitung soll aber in einer neuen Datei:maclist folgender Inhalt stehen:

0000f4b21ba1 192.168.6.232 1126257685

stehen.

Vor 168 muß 192. eingefügt werden.
Nach 168.6.232 muß der Punkt und alle Zeichen bis 1126257685 entfernt werden, wobei aber ein Leerzeichen erhalten bleiben muß.

Bei den Zahlen 168 handelt es sich um ip Adressen wie 192.168.x.x
Man könnte also sagen LÖSCHE nach der Zahl 168 ab dem dritten Punkt, diesen dritten Punkt und alle folgenden Zeichen bis zum Zahlenblock 1126257685.

Also aus:

0000f4b21ba1 168.6.232.1004776 1126257685
wird
0000f4b21ba1 192.168.6.232 1126257685



Das Script sollte als cronjob auf linux laufen.


Kann mir jemand helfen?


Danke

Andreas Oetter
 
Zuletzt bearbeitet:
Hallo
Deine Datei sei daten
Ich mach das mal mit perl :D

perl -pi"_bak" -e '~s!^(.*?)\s+(\d{1,3}\.\d{1,3}\.\d{1,3})\.(.*)$!$1 192.$2 $3!g' daten

Dabei wird noch eine Datei daten_bak als backup angelegt.

Gruß Wolfgang
 
ein kleiner Nachtrag noch..

Erst mal Danke für diese "SUPER" Zeile Code.

Nach dem Durchlauf schauen die Zeile nun so aus:

0000f4e1a6a1 192.168.6.207 1496945 1127193604
...

Der Eintrag 1496945, 6 Stellen, die einen Zeitstempel darstellen und daher
verschiedene Zahlen enthält muß entfernt werden.

Es sollte am Ende das Ergebnis so sein:

0000f4e1a6a1 192.168.6.207 1127193604

Danke

Andreas Oetter
:) Zirkuskater :)
...
 
Hallo
Sorry hab ich wohl heut Nacht übersehen.
Dann ganz ungetestet:
perl -pi"_bak" -e '~s!^(.*?)\s+(\d{1,3}\.\d{1,3}\.\d{1,3})\.[^ ]+(.*)$!$1 192.$2$3!g' daten
Gruß Wolfgang
 
fast am Ziel

Geht leider nicht. Wirft irgendwie alle Zeilen zusammen.

Jetzt ist leider noch ein Problem aufgetaucht.

Ich bekomme von meinem Router doppelte Einträge zurück.

0000f4e1a6a1 192.168.6.207 1496945 1127193604
0000f4e1a6a1 192.168.6.207 1496944 1127193610
0000f4e1a6a2 192.168.6.210 1496949 1127193604
0000f4e1a682 192.168.6.212 1496945 1127193604

Wie aus Zeile 2 ersichtlich kommt dort der Eintrag mit der MAC
0000f4e1a6a1 doppelt vor. Ich benötige jedoch nur eine Zeile mit diesem Eintrag. Ich bekomme es leider nicht auf die Reihe das er mir jeweils doppelte
Zeilen löscht. Der Zahlenblock vor 112719**** muß natürlich noch gelöscht werden.

Danke

Andreas Oetter

Zirkuskater
 
Zuletzt bearbeitet:
Hallo
Zeilen zusammenwerfen kann dieser Einzeiler nicht, da nur Zeilenweise manipuliert wird.
Also bei mir tut diese Regexp genau was du in deinem ersten Posting wolltest.
Wenn deine Daten natürlich ganz anders daherkommen, kann das natürlich nicht gehen.
Sorry ich verstehe nicht so recht was du mit welchen Daten genau willst.
Schau dir einfach mal die Daten an, und gib ein Beispiel was in welcher Form kommt und du als Ergebnis haben willst.
Siehe auch
man sort man uniq

Gruß Wolfgang
 
Nachtrag:
Ich gehe dabei davon aus, dass deine Daten ohne Leerzeilen und in genau der Form
- wie im ersten Beitrag von dir beschrieben - daherkommen.
Also schau dir die Eingabedatei nochmal genau an.

Gruß Wolfgang
 
es geht.... supi

Lag wohl doch an mir.
Es geht.

Für die doppelten Einträge verwende ich

uniq -s 12 daten > daten_neu


Danke für die Hilfe

Andreas Oetter
Zirkuskater
 
Zuletzt bearbeitet:
Hallo
Schön, dass es geht.
Bedenke aber, dass uniq nur funktioniert, wenn die Daten sortiert kommen.
Also ist wohl eine Pipe hier recht brauchbar.
gekürzt:
cat datei|sort|uniq -c|perl -pe '~s....' >result_file

Gruß Wolfgang
 
Zurück
Oben