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

< Previous Next >
References