Mailinglist Archive: opensuse-de (4731 mails)
| < Previous | Next > |
Re: Online-Zeit aus /var/log/messages ziehen
- From: David Haller <david@xxxxxxxxxx>
- Date: Fri, 20 Jul 2001 21:57:04 +0200
- Message-id: <20010720215704.A926@xxxxxxxxxx>
On Fre, 20 Jul 2001, Jan Tim Schueszler wrote:
>ich möchte mir aus den archivierten Logfiles meine Online-Zeiten
>monatsweise extrahieren, um diese dann evtl in einer
>Tabellenkalkulation zu verarbeiten.
>
>Die betreffenden Zeilen sehen folgendermaßen aus:
>
>Jul 19 21:47:44 server pppd[2366]: Connect time 5.1 minutes.
>
>Die entsprechen Zeilen erhalte ich mit:
>
>#less /var/log/messages | grep "Connect time"
Das schreibe besser als: 'grep "Connect time" /var/log/messages'
Das less ist eh "lfacsh" fuer diesen Zweck (cat ware richtig),
aber es ist ueberfluessig.
>Um die Zahlen für einen bestimmten Monat zu bekommen, hänge ich
>noch ein | grep "May" für den Mai dran.
Wie waere es mit sed?
sed -n '/^May.*pppd.*Connect time/s/.*time \([0-9.]*\).*/\1/p' \
/var/log/messages
(eine Zeile!)
Zur Erklaerung:
sed -n gibt keine Zeilen aus, die nicht explizit mit dem /p
modifier eines Befehls ausgegeben werden. Zusammen mit:
/MUSTER/ ist eine "Adresse", d.h. der folgende Befehl wird
nur ausgefuehrt, wenn das Muster auf die Zeile passt.
s/MUSTER/ERSETZUNG/p fuehrt einen Ersetzungsbefehl aus und gibt
die Zeile aus (durch das /p auch trotz dem -n).
sed -n /^May.*pppd.*Connect time/p
entspricht also (ein wenig verfeintert) dem
grep '^May.*Connect time' /var/log/messages
zu dem sich deine beiden greps zusammenfassen lassen.
Nun kommt die Ersetzung an die Reihe, die nur auf die mit /MUSTER/
ausgewaehlten Zeilen angewandt wird:
s/.*time \([0-9.]*\).*/\1/p
Zu deutsch:
packe beliebig viele Zahlen und Punkte, die direkt aufeinander
folgen und die nach einem 'time ' kommen in den Puffer 1.
Das wird durch das \(\)-paeerchen bewirkt.
Ersetze die ganze Zeile (wg. der '.*', der Rest dient nur zur
Isolierung der Zahlen), durch den Puffer 1:
Das /p besagt nun, dass die so modifizierte Zeile ausgegeben werden
soll.
Das Ergebnis ist nur die gewuenschte Zeit in Minuten.
Laesst du das zweite .* (hinter dem '\)' weg, dann landet auch noch
das ' minutes.' in der Ausgabe, willst du nur ein 'minutes', so
packst du das 'minutes', aber nicht den Punkt mit in den Puffer:
sed -n '/^May.*pppd.*Connect time/s/.*time \([0-9.]*.*\)\./\1/p'
^^ das greift
sich das minutes, der Punkt wird durch das \. hinter dem \)
ausgeschlossen.
HTH
-dnh
--
Chance is irrelevant. We will succeed. -- Seven of Nine
>ich möchte mir aus den archivierten Logfiles meine Online-Zeiten
>monatsweise extrahieren, um diese dann evtl in einer
>Tabellenkalkulation zu verarbeiten.
>
>Die betreffenden Zeilen sehen folgendermaßen aus:
>
>Jul 19 21:47:44 server pppd[2366]: Connect time 5.1 minutes.
>
>Die entsprechen Zeilen erhalte ich mit:
>
>#less /var/log/messages | grep "Connect time"
Das schreibe besser als: 'grep "Connect time" /var/log/messages'
Das less ist eh "lfacsh" fuer diesen Zweck (cat ware richtig),
aber es ist ueberfluessig.
>Um die Zahlen für einen bestimmten Monat zu bekommen, hänge ich
>noch ein | grep "May" für den Mai dran.
Wie waere es mit sed?
sed -n '/^May.*pppd.*Connect time/s/.*time \([0-9.]*\).*/\1/p' \
/var/log/messages
(eine Zeile!)
Zur Erklaerung:
sed -n gibt keine Zeilen aus, die nicht explizit mit dem /p
modifier eines Befehls ausgegeben werden. Zusammen mit:
/MUSTER/ ist eine "Adresse", d.h. der folgende Befehl wird
nur ausgefuehrt, wenn das Muster auf die Zeile passt.
s/MUSTER/ERSETZUNG/p fuehrt einen Ersetzungsbefehl aus und gibt
die Zeile aus (durch das /p auch trotz dem -n).
sed -n /^May.*pppd.*Connect time/p
entspricht also (ein wenig verfeintert) dem
grep '^May.*Connect time' /var/log/messages
zu dem sich deine beiden greps zusammenfassen lassen.
Nun kommt die Ersetzung an die Reihe, die nur auf die mit /MUSTER/
ausgewaehlten Zeilen angewandt wird:
s/.*time \([0-9.]*\).*/\1/p
Zu deutsch:
packe beliebig viele Zahlen und Punkte, die direkt aufeinander
folgen und die nach einem 'time ' kommen in den Puffer 1.
Das wird durch das \(\)-paeerchen bewirkt.
Ersetze die ganze Zeile (wg. der '.*', der Rest dient nur zur
Isolierung der Zahlen), durch den Puffer 1:
Das /p besagt nun, dass die so modifizierte Zeile ausgegeben werden
soll.
Das Ergebnis ist nur die gewuenschte Zeit in Minuten.
Laesst du das zweite .* (hinter dem '\)' weg, dann landet auch noch
das ' minutes.' in der Ausgabe, willst du nur ein 'minutes', so
packst du das 'minutes', aber nicht den Punkt mit in den Puffer:
sed -n '/^May.*pppd.*Connect time/s/.*time \([0-9.]*.*\)\./\1/p'
^^ das greift
sich das minutes, der Punkt wird durch das \. hinter dem \)
ausgeschlossen.
HTH
-dnh
--
Chance is irrelevant. We will succeed. -- Seven of Nine
| < Previous | Next > |