awk und sed in Datei ersetzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
peppie
Beiträge: 33
Registriert: 02.07.2011 12:47:13

awk und sed in Datei ersetzen

Beitrag von peppie » 21.10.2014 16:30:21

Hallo zusammen,

ich habe eine Frage zu awk und sed in der Bash.

In einer log Datei habe ich folgende Syntax

Code: Alles auswählen

unixtimestamp;IP-Adresse;ID; etc. pp.
Ich möchte nun den Unixtimestamp durch einen normalen Zeitstempel ersetzen, der so aussieht:

Code: Alles auswählen

16/10/2014-14:50:36
Die Ausgabe in der Shell klappt auch mit dem folgenden Kommando:

Code: Alles auswählen

cat .logdatei.log | awk '{printf("%s", strftime("%d/%m/%Y-%H:%M:%S",$1)); }'
Modifizierter Code von hier: http://ropata.wordpress.com/2009/05/26/utime2ymd/

Allerdings weiß ich nicht, wie ich das nun mit sed in der logdatei.log ändere.

Könnt ihr mir vielleicht helfen?

Viele Grüße

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: awk und sed in Datei ersetzen

Beitrag von Cae » 21.10.2014 16:40:24

Naja, die naheliegende Loesung waere, den Logger auf menschenlesbares Format umzustellen...

Dein awk-Code da sollte eigentlich nie funktionieren, bzw. nichts ausser den Timestamps anzeigen. Fuer das "Ersetzen" wuerde ich einfach die Datei weg-mv-en und in die Original-Datei zurueckschreiben:

Code: Alles auswählen

$ mv a.log tmp
$ touch --reference=tmp a.log
$ chmod --reference=tmp a.log
$ gawk '{ts=$1; $1=""; print(strftime("%F.%T", ts) "" $0)}' <tmp >a.log
$ rm -f tmp
strftime() geht uebrigens nur im gawk und in vielen anderen awk-Implementationen nicht. Daher sollte man explizit angegeben, welches Programm man haben will.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

peppie
Beiträge: 33
Registriert: 02.07.2011 12:47:13

Re: awk und sed in Datei ersetzen

Beitrag von peppie » 21.10.2014 16:55:18

Cae hat geschrieben:Naja, die naheliegende Loesung waere, den Logger auf menschenlesbares Format umzustellen...
Der Logger ist schon umgestellt, es geht nur um ältere Logs.
Sorry, ich hab vergessen das dabei zu schreiben.
Cae hat geschrieben: Dein awk-Code da sollte eigentlich nie funktionieren, bzw. nichts ausser den Timestamps anzeigen.
Tut er aber :)

Fuer das "Ersetzen" wuerde ich einfach die Datei weg-mv-en und in die Original-Datei zurueckschreiben:

Code: Alles auswählen

$ mv a.log tmp
$ touch --reference=tmp a.log
$ chmod --reference=tmp a.log
$ gawk '{ts=$1; $1=""; print(strftime("%F.%T", ts) "" $0)}' <tmp >a.log
$ rm -f tmp
strftime() geht uebrigens nur im gawk und in vielen anderen awk-Implementationen nicht. Daher sollte man explizit angegeben, welches Programm man haben will.
[/quote]

Dein Code löscht leider zerstört das Log, so dass bei bei 3/4 aller Zeilen alles nach dem ersten Semikolon ausradiert wird.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: awk und sed in Datei ersetzen

Beitrag von Cae » 21.10.2014 17:25:19

peppie hat geschrieben:Dein Code löscht leider zerstört das Log, so dass bei bei 3/4 aller Zeilen alles nach dem ersten Semikolon ausradiert wird.
Ich sehe gerade, das haengt mit einer speziellen Eigenheit deiner Eingangsdaten zusammen. Die Felder sind per Semikolon ; getrennt, anstatt per Whitespace. Das muss man explizit als FS (field separator) und OFS (output field separator) angeben:

Code: Alles auswählen

gawk 'BEGIN{FS=OFS=";"}{ts=$1; $1=""; print(strftime("%F.%T", ts) "" $0)}' <tmp >a.log
Ich habe gerade nochmal extra getestet und verstehe nicht, wieso das bei dir oben gehen soll:

Code: Alles auswählen

$ awk -vnow="$(date +%s)" 'BEGIN{for(i=0;i<9;i++)printf("%d;192.168.0.%d;%d;foo\n",now+i,i,1234+i)}' > testdata
$ cat testdata
1413904872;192.168.0.0;1234;foo
1413904873;192.168.0.1;1235;foo
1413904874;192.168.0.2;1236;foo
1413904875;192.168.0.3;1237;foo
1413904876;192.168.0.4;1238;foo
1413904877;192.168.0.5;1239;foo
1413904878;192.168.0.6;1240;foo
1413904879;192.168.0.7;1241;foo
1413904880;192.168.0.8;1242;foo
$ gawk '{printf("%s", strftime("%d/%m/%Y-%H:%M:%S",$1)); }' testdata
21/10/2014-17:21:1221/10/2014-17:21:1321/10/2014-17:21:1421/10/2014-17:21:1521/10/2014-17:21:1621/10/2014-17:21:1721/10/2014-17:21:1821/10/2014-17:21:1921/10/2014-17:21:20$ 
$ gawk 'BEGIN{FS=OFS=";"}{ts=$1; $1=""; print(strftime("%F.%T", ts) "" $0)}' testdata
2014-10-21.17:21:12;192.168.0.0;1234;foo
2014-10-21.17:21:13;192.168.0.1;1235;foo
2014-10-21.17:21:14;192.168.0.2;1236;foo
2014-10-21.17:21:15;192.168.0.3;1237;foo
2014-10-21.17:21:16;192.168.0.4;1238;foo
2014-10-21.17:21:17;192.168.0.5;1239;foo
2014-10-21.17:21:18;192.168.0.6;1240;foo
2014-10-21.17:21:19;192.168.0.7;1241;foo
2014-10-21.17:21:20;192.168.0.8;1242;foo
$ 
Dem printf() fehlt die Newline, daher wird's total zerrupft und ausserdem faellt da nur das Datum raus.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

peppie
Beiträge: 33
Registriert: 02.07.2011 12:47:13

Re: awk und sed in Datei ersetzen

Beitrag von peppie » 21.10.2014 17:40:56

Vielen Dank!

Jetzt funktioniert es.

Ich lerne noch sed bzw awk und werde mir das Beispiel nun zerflücken um zu verstehen was genau passiert ;-)

Edit: Ich bin wahrscheinlich blind, aber ich finde die Option für gelöst makieren grad nicht.
Kannst du mir auf die Sprünge helfen?

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: awk und sed in Datei ersetzen

Beitrag von Cae » 21.10.2014 19:33:10

peppie hat geschrieben:Ich bin wahrscheinlich blind, aber ich finde die Option für gelöst makieren grad nicht.
Kannst du mir auf die Sprünge helfen?
Das hat nichts mit deinem Optiker zu tun, es gibt hier keinen Knopf dieser Art. Die verwendete Loesung ist es, den ersten Beitrag zu editieren und dort im "Betreff" so etwas wie "[geloest]" davorzuschreiben.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten