Re: Online-Zeit aus /var/log/messages ziehen
Jan Tim Schueszler
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 läßt sich etwas verkürzen. grep kann man direkt einen Dateinamen als Argument übergeben, es ist also nicht nötig, die Datei erst mit einem anderen Kommando zu lesen und über eine Pipe an grep durchzureichen. Also: grep "Connect time" /var/log/messages
Um die Zahlen für einen bestimmten Monat zu bekommen, hänge ich noch ein | grep "May" für den Mai dran.
Das läßt sich natürlich auch kürzer machen ;-) grep arbeitet mit regulären Ausdrücken, und da ist dann z.B. folgendes möglich: grep "^May .* Connect time " /var/log/messages Dabei steht '^' für den Zeilenanfang, '.' für ein beliebiges Zeichen und '*' für eine beliebige Wiederholung des vorhergehenden Zeichens. Also steht ".*" für beliebig viele beliebige Zeichen.
Damit habe ich aber erst die Zeilen. Mein Ziel ist es aber, nur die Zahl, sprich die Verbindungszeit, zu bekommen. Wie kann ich das nun bewerkstelligen?
Da gibt's reichlich Möglichkeiten... Mit sed z.B. so: grep ... | sed 's/.*Connect time \(.*\) minutes.*/\1/' Ein sed-Kommand der Form "s/A/B/" ersetzt in jeder Zeile einen String, der auf den regulären Ausdruck A paßt (so einer vorhanden ist) durch den String B. Die Konstruktion \(...\) in einem regulären Ausdruck in sed bezeichnet einen Teilausdruck (hier das Stück, wo die von Dir gewünschte Zahl steht). Und \1 in dem Ersatz-String steht für den ersten so markierten Teilausdruck des zu ersetzenden Strings.
Meine Ahnung sagt mir, daß ich evtl. mit awk weiterkommen könnte, leider sind meine entsprechenden Kenntnisse dazu gleich null.
Mit awk geht's auch. Da kann man sich sogar sehr leicht (mit sed ginge es auch, aber etwas umständlicher) den grep-Aufruf sparen: awk '/^May .* Connect time / { print $8; }' /var/log/messages Erklärung: Aus allen Zeilen, die auf den angegebenen regulären Ausdruck (/.../) passen, gibt awk das achte Feld aus. Eilert -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Eilert Brinkmann -- Universitaet Bremen -- FB 3, Informatik eilert@informatik.uni-bremen.de - eilert@tzi.org http://www.informatik.uni-bremen.de/~eilert/
On Fre, 20 Jul 2001, Eilert Brinkmann wrote:
Mit awk geht's auch. Da kann man sich sogar sehr leicht (mit sed ginge es auch, aber etwas umständlicher) den grep-Aufruf sparen:
Ja. Und zwar genauso "einfach". Auch sed kennt den Adress-Operator: sed -n '/ADRESSE/s/MUSTER/ERSETZUNG/p' DATEI (Wobei ADRESSE wieder eine Regex ist, zu -n und dem p modifier hab ich schon geschrieben). Das entspricht also: grep 'ADRESSE' DATEI | sed 's/MUSTER/ERSETZUNG/' -dnh -- Linux is like a teepee: No windows, no gates, an Apache inside.
* David Haller schrieb am 21.Jul.2001:
On Fre, 20 Jul 2001, Eilert Brinkmann wrote:
Mit awk geht's auch. Da kann man sich sogar sehr leicht (mit sed ginge es auch, aber etwas umständlicher) den grep-Aufruf sparen:
Ja. Und zwar genauso "einfach". Auch sed kennt den Adress-Operator:
sed -n '/ADRESSE/s/MUSTER/ERSETZUNG/p' DATEI
(Wobei ADRESSE wieder eine Regex ist, zu -n und dem p modifier hab ich schon geschrieben).
Das entspricht also:
grep 'ADRESSE' DATEI | sed 's/MUSTER/ERSETZUNG/'
Nein. Es entspricht grep 'ADRESSE' DATEI | sed -n 's/MUSTER/ERSETZUNG/p' oder grep 'ADRESSE' DATEI | grep MUSTER | sed 's/MUSTER/ERSETZUNG/' Äquivalent zu grep 'ADRESSE' DATEI | sed 's/MUSTER/ERSETZUNG/' ist sed -n '/ADRESSE/s/MUSTER/ERSETZUNG /ADRESSE/p' DATEI Vorausgesetzt, in ADRESSE steckt nicht MUSTER, sonst muß in der zweiten Zeile MUSTER durch ERSETZUNG ersetzt werden. Allerdings darf dann nicht ERSETZUNG sonstwo aufgetaucht sein. ;) Bernd -- ACK = ACKnowledge = Zustimmung | NAC = No ACknowledge = keine Zustimmung DAU = Dümmster Anzunehmender User | LOL = Laughing Out Loud = Lautes Lachen IIRC = If I Remember Correctly = Falls ich mich richtig erinnere OT = Off Topic = Am Thema (der Liste) vorbei |Zufallssignatur 11
On Sam, 21 Jul 2001, Bernd Brodesser wrote:
* David Haller schrieb am 21.Jul.2001:
sed -n '/ADRESSE/s/MUSTER/ERSETZUNG/p' DATEI Das entspricht also:
grep 'ADRESSE' DATEI | sed 's/MUSTER/ERSETZUNG/'
Nein. Es entspricht
grep 'ADRESSE' DATEI | sed -n 's/MUSTER/ERSETZUNG/p'
Nein. *scnr*. grep 'ADRESSE' =~= sed -n '/ADRESSE/p' Dass dann _anschliessend_ auf den mit /ADRESSE/ oder grep ausgefilterten Zeilen noch eine Ersetzung stattfindet ist irrelevant. Mal "eindeutig" geschrieben: grep 'ADRESSE' DATEI | sed 's/MUSTER/ERSETZUNG/' =~= sed -n '/ADRESSE/p' DATEI | sed 's/MUSTER/ERSETZUNG/' ^^kein -n ^ kein p = sed -n '/ADRESSE/s/MUSTER/ERSETZUNG/p' DATEI -dnh -- Windows verhält sich zu Betriebssystemen wie Astrologie zu Astronomie. -- am DLUG-Stammtisch
Hallo David, * David Haller schrieb am 21.Jul.2001:
On Sam, 21 Jul 2001, Bernd Brodesser wrote:
* David Haller schrieb am 21.Jul.2001:
sed -n '/ADRESSE/s/MUSTER/ERSETZUNG/p' DATEI Das entspricht also:
grep 'ADRESSE' DATEI | sed 's/MUSTER/ERSETZUNG/'
Das ist defenitiv nicht das selbe. Ich habe es gerade noch einmal getestet. Bei sed -n '/ADRESSE/s/MUSTER/ERSETZUNG/p' DATEI tauchen nur die Zeilen auf, die ADRESSE enthalten _und_ wo eine Ersetzung vorgenommen wurde. Bei grep 'ADRESSE' DATEI | sed 's/MUSTER/ERSETZUNG/' tauchen alle Zeilen auf, die ADRESSE enthalten, auch wenn in dieser Zeile keine Ersetzung vorgenommen wurde.
Nein. Es entspricht
grep 'ADRESSE' DATEI | sed -n 's/MUSTER/ERSETZUNG/p'
Nein. *scnr*. grep 'ADRESSE' =~= sed -n '/ADRESSE/p'
Was bedeutet =~= ?
Dass dann _anschliessend_ auf den mit /ADRESSE/ oder grep ausgefilterten Zeilen noch eine Ersetzung stattfindet ist irrelevant.
Ist es nicht.
Mal "eindeutig" geschrieben:
grep 'ADRESSE' DATEI | sed 's/MUSTER/ERSETZUNG/'
=~=
sed -n '/ADRESSE/p' DATEI | sed 's/MUSTER/ERSETZUNG/' ^^kein -n ^ kein p
Ja, beide obigen Zeilen zeitigen das gleiche Ergebniß. Ich nehme mal an, daß =~= ungefähr bedeuten soll, da grep eine etwas andere Syntax für das Muster hat.
=
sed -n '/ADRESSE/s/MUSTER/ERSETZUNG/p' DATEI
Und das stimmt nicht. Probiers aus! Du brauchst eine Zeile, die ADRESSE nicht aber MUSTER enthält. Sie taucht hier nicht auf. $ sed --version GNU sed version 3.02 Bernd -- LILO funktioniert nicht? Hast Du /etc/lilo.conf verändert und vergessen, lilo aufzurufen? Ist Deine /boot-Partition unter der 1024 Zylindergrenze? Bei anderen LILO Problemen mal in der SDB nachschauen: http://localhost/doc/sdb/de/html/rb_bootdisk.html |Zufallssignatur 6
On Sam, 21 Jul 2001, Bernd Brodesser wrote:
Hallo David,
* David Haller schrieb am 21.Jul.2001:
On Sam, 21 Jul 2001, Bernd Brodesser wrote:
* David Haller schrieb am 21.Jul.2001:
sed -n '/ADRESSE/s/MUSTER/ERSETZUNG/p' DATEI Das entspricht also:
grep 'ADRESSE' DATEI | sed 's/MUSTER/ERSETZUNG/'
Das ist defenitiv nicht das selbe. Ich habe es gerade noch einmal getestet. Bei
sed -n '/ADRESSE/s/MUSTER/ERSETZUNG/p' DATEI
tauchen nur die Zeilen auf, die ADRESSE enthalten _und_ wo eine Ersetzung vorgenommen wurde.
Ja.
Bei
grep 'ADRESSE' DATEI | sed 's/MUSTER/ERSETZUNG/'
tauchen alle Zeilen auf, die ADRESSE enthalten, auch wenn in dieser Zeile keine Ersetzung vorgenommen wurde.
Ja. Ich hatte es lfasch gelesen ;)
Nein. *scnr*. grep 'ADRESSE' =~= sed -n '/ADRESSE/p'
Was bedeutet =~= ?
Dass sich beide Befehle entsprechen und vertauschbar sind. (ein = Zeichen mit dem ~ drueber).
Dass dann _anschliessend_ auf den mit /ADRESSE/ oder grep ausgefilterten Zeilen noch eine Ersetzung stattfindet ist irrelevant.
Ist es nicht.
Korrekt.
Mal "eindeutig" geschrieben:
grep 'ADRESSE' DATEI | sed 's/MUSTER/ERSETZUNG/'
=~=
sed -n '/ADRESSE/p' DATEI | sed 's/MUSTER/ERSETZUNG/' ^^kein -n ^ kein p
Ja, beide obigen Zeilen zeitigen das gleiche Ergebniß. Ich nehme mal an, daß =~= ungefähr bedeuten soll, da grep eine etwas andere Syntax für das Muster hat.
*g*, ne, einfach, dass beide Austauschbar sind (gleiches Ergebnis).
=
sed -n '/ADRESSE/s/MUSTER/ERSETZUNG/p' DATEI
Und das stimmt nicht. Probiers aus! Du brauchst eine Zeile, die ADRESSE nicht aber MUSTER enthält. Sie taucht hier nicht auf.
Ack. Sorry. ISC. Ich hatte diesen allgemeine(re)n Fall nicht beachtet. So, jetzt hab auch ich mal wieder was gelernt :) -dnh -- Ich hoffe das dieser Satz nicht so endet wie die meisten von mir. Nämlich als Wognatur. [WoKo in dag°]
participants (3)
-
B.Brodesser@t-online.de
-
David Haller
-
Eilert Brinkmann