[gelöst] xsession-errors - doppelte Einträge filtern

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Alad
Beiträge: 90
Registriert: 24.01.2014 16:20:09

[gelöst] xsession-errors - doppelte Einträge filtern

Beitrag von Alad » 14.02.2014 12:12:45

Hallo,

Meine xsession-errors wird immer mit den gleichen Meldungen zugemüllt. Um die Übersicht zu behalten möchte ich gern jede Meldung nur einmal anzeigen lassen.

Könnte man ein Script machen das Meldungen nur dann wegschreibt, wenn sie neu sind?
Zuletzt geändert von Alad am 17.02.2014 02:22:48, insgesamt 1-mal geändert.
Debian Wheezy, Openbox, A64 3000+, HD 6450

zwiebelchen
Beiträge: 138
Registriert: 31.03.2011 12:51:42

Re: xsession-errors - doppelte Einträge filtern

Beitrag von zwiebelchen » 14.02.2014 14:26:43

Du könntest die Datei einlesen, durch 'uniq' schicken und neu speichern...
Debian 7 Wheezy mit Gnome 3 auf Xeon 1230V2, Asus P8H77, 16 GB DDR3, 120 GB Samsung 830 SSD, Gigabyte GTX 660

Benutzeravatar
Alad
Beiträge: 90
Registriert: 24.01.2014 16:20:09

Re: xsession-errors - doppelte Einträge filtern

Beitrag von Alad » 14.02.2014 16:04:01

Danke für den Tipp! Nach etwas herumsuchen habe ich den folgenden Befehl zusammengesetzt:

Code: Alles auswählen

~$ grep . .xsession-errors | uniq | awk -v n=1 '1; NR % n == 0 {print ""}' | tee -i .xsession-errors
Jetzt muss ich nur noch herausfinden wie ich das automatisieren soll

edit: tee löscht die Datei ganz, daher tee -i
Zuletzt geändert von Alad am 14.02.2014 19:51:20, insgesamt 1-mal geändert.
Debian Wheezy, Openbox, A64 3000+, HD 6450

zwiebelchen
Beiträge: 138
Registriert: 31.03.2011 12:51:42

Re: xsession-errors - doppelte Einträge filtern

Beitrag von zwiebelchen » 14.02.2014 16:20:06

Als minütlichen / stündlichen / täglichen cronjob ?

Code: Alles auswählen

crontab -e
Dann als Zeile einfügen:

Code: Alles auswählen

0 * * * * grep . .xsession-errors | uniq | awk -v n=1 '1; NR % n == 0 {print ""}' | tee .xsession-errors
Wird dann jede volle Stunde ausgeführt.

Wirst die Pfade sicher absolut machen müssen, aber sonst sollte es klappen...
Debian 7 Wheezy mit Gnome 3 auf Xeon 1230V2, Asus P8H77, 16 GB DDR3, 120 GB Samsung 830 SSD, Gigabyte GTX 660

Benutzeravatar
Alad
Beiträge: 90
Registriert: 24.01.2014 16:20:09

Re: xsession-errors - doppelte Einträge filtern

Beitrag von Alad » 14.02.2014 20:57:19

Ich hab den Befehl direkt in crontab eingetragen (mit Pfaden) und es via Skript versucht, aber jedes mal ignoriert tee das -i Argument und löscht meine .xsession-errors Datei ganz. Direkt vom Terminal aus geht es aber bestens...
Debian Wheezy, Openbox, A64 3000+, HD 6450

Benutzeravatar
Alad
Beiträge: 90
Registriert: 24.01.2014 16:20:09

Re: xsession-errors - doppelte Einträge filtern

Beitrag von Alad » 15.02.2014 02:39:10

Anscheinend mag tee -i das Ganze auch zu überschreiben. Nun gut, eine separate, gefilterte Datei sollte mir im Moment reichen.

Code: Alles auswählen

*/1 * * * * /bin/grep . $HOME/.xsession-errors | /usr/bin/uniq | /usr/bin/tee $HOME/.xsession-errors.filt
Danke nochmal für die Hilfe. :)
Debian Wheezy, Openbox, A64 3000+, HD 6450

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: xsession-errors - doppelte Einträge filtern

Beitrag von linuxCowboy » 15.02.2014 15:52:37

Du könntest dir auch einen Alias setzen und die Original-Datei nehmen:

Code: Alles auswählen

alias xsv='uniq ~/.xsession-errors | less'
PS: grep . file | uniq statt uniq file sieht grausam aus :|
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
Alad
Beiträge: 90
Registriert: 24.01.2014 16:20:09

Re: xsession-errors - doppelte Einträge filtern

Beitrag von Alad » 15.02.2014 20:48:35

Das ist ja eine ganz gute Idee.
grep . file | uniq statt uniq file sieht grausam aus
Stimmt schon, aber leider geht uniq file hier nicht weil zwischen jedem Eintrag eine Weißlinie steht. Ich habe an sort -u gedacht, das hat auch weniger doppelte Einträge, aber verliert die richtige Reihenfolge (mit alias kann ich aber beides machen).
Debian Wheezy, Openbox, A64 3000+, HD 6450

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

Re: xsession-errors - doppelte Einträge filtern

Beitrag von Cae » 16.02.2014 07:46:25

Alad hat geschrieben:aber jedes mal ignoriert tee das -i Argument und löscht meine .xsession-errors Datei ganz. Direkt vom Terminal aus geht es aber bestens...
Das ist erstaunlich, weil es eigentlich gar nicht funktionieren sollte. Sobald du irgendwo in einer Pipe aus einer Datei liest und direkt wieder zurueckschreibst, hast du spaetestens nach ein paar MB Datenverlust. Und dein Cronjob scheitert am %, siehe
man 5 crontab hat geschrieben:

Code: Alles auswählen

                                            Percent-signs (%) in the  command,
       unless escaped with backslash (\), will be changed into newline charac‐
       ters, and all data after the first % will be sent  to  the  command  as
       standard  input.
Die Anwendung von awk ist erschwerter Bloedsinn, denn x%1 hat fuer alle x den Wert 0, also reduziert sich die Wirkung auf ein simples

Code: Alles auswählen

awk '{print; print("")}' # was dasselbe tut wie
awk '{print($0 RS)}'
... und wozu das gut sein soll, sehe ich auch nicht. Sinnvoller waere es, awk als uniq-Ersatz, welcher keinen sortierten Input braucht, einzusetzen:

Code: Alles auswählen

awk '!a[$0]++'
Das legt ein Array namens a an, welches als Schluessel die komplette Zeile hat. Sofern eine Zeile namens 'foo' sich noch nicht im Array befindet, ergibt der Wert a["foo"] logisch falsch, welches per ! zu logisch wahr negiert wird, was das implizite print($0) ausloest. Anschliessend wird a["foo"] inkrementiert, sodass beim naechsten Vorkommen der Eingabezeile 'foo' der Wert fuer a["foo"] logisch wahr ist, und negiert nicht das implizite print($0) ausloest. Also werden alle weiteren Duplikate unterdrueckt. Genau wie uniq, nur halt ohne zwingende Sortierung.

Damit waere das fragwuerdige grep ebenso ueberfluessig. Wenn es denn noetig waere, wuerde man das sauber als

Code: Alles auswählen

grep -v '^$'
schreiben. Dies trifft viel genauer die Denkweise: "gib' mir alle Zeilen mit einem beliebigen Zeichen darin" ist nicht das Ziel der Sache, sondern "gib' mir alles, ausser jener Zeilen, die nichts zwischen Zeilenanfang und -Ende haben".

Und dein tee ist wohl gaenzlich ueberfluessig, denn du willst nicht gleichzeitig sowohl auf das Terminal als auch in eine Datei schreiben, sondern nur in eine Datei. Falls du in die Mails vom crond schauen wuerdest, wuerde dir auffallen, dass dort der komplette Output drin landet. Verwende simpel > anstatt tee und >> anstatt tee -a.

Abschliessend wuerde ich den Cronjob

Code: Alles auswählen

0 * * * * /usr/bin/awk '!a[$0]++' <$HOME/.xsession-errors >$HOME/.xsession-errors-filtered
vorschlagen. Dabei wird die ~/.xsession-errors nicht geleert, was vielleicht sinnig waere.

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

Benutzeravatar
Alad
Beiträge: 90
Registriert: 24.01.2014 16:20:09

Re: xsession-errors - doppelte Einträge filtern

Beitrag von Alad » 16.02.2014 14:48:14

Da lernt man gerne wenn es einem so gut erklärt wird. :) Danke sehr :THX:
Debian Wheezy, Openbox, A64 3000+, HD 6450

Antworten