Antwort an: Re: Shell scripte Hallo Liste, vielen für die Antworten. Entschuldigung für die langen Zeilen (habe ein internes Mail Formular ausgewählt). Ich möchte eine Cisco Pix Firewall auf einem SuSE Linux Rechner mit "syslogd" loggen. Die Zeilen die gelogt sind sehr lang. z.b. Oct 22 09:27:00 192.168.1.1 %PIX-6-101001: TCP connection 910452 faddr 192.168.1.1/80 gaddr 192.168.1.1/80 laddr 192.168.1.1/80 duration 0:00:01 bytes 4190 (TCP Reset-I) Aus so einer Zeile möchte die Zahl hinter dem Wort "bytes" auslesen. Schön wäre die Zeichen Position von "b" vom dem Wort "bytes", dann könnte ich mit dem Programm cut die Zeilen wie gewünscht Schneiden. mfg Heiner P.S. Perl Scripten habe ich mir noch nicht angesehen.
Hallo Liste, für ein shell script suche ich den Befehl, die Zeichen Position im string (Zeichenkette) finden. Damit ich mit dem Programm "cut" von Zeichen 1 bis x > oder andersherum ausschneiden kann. Mit dem Programm "cut" kann ich ein > delimiter Zeichen setzen. Das hilft mir nicht weiter, denn ich muss ein Wort > mit vier Zeichen finden. Denn die Zeichenkette ist lang (über 100 Zeichen).
Kann mir dabei einer weiterhelfen?
On 2002-10-22 11:14:11, Heiner Iserloth wrote:
Antwort an: Re: Shell scripte Hallo Liste, vielen für die Antworten. Entschuldigung für die langen Zeilen (habe ein internes Mail Formular ausgewählt).
Die sind immer noch zu lang, dann mußt Du halt manuell auf die Returntaste drücken ...
z.b. Oct 22 09:27:00 192.168.1.1 %PIX-6-101001: TCP connection 910452 faddr 192.168.1.1/80 gaddr 192.168.1.1/80 laddr 192.168.1.1/80 duration 0:00:01 bytes 4190 (TCP Reset-I)
die regex (in perl) dafür: ($bytes) = $line =~ m/.*bytes (\d*)/;
Aus so einer Zeile möchte die Zahl hinter dem Wort "bytes" auslesen. Schön wäre die Zeichen Position von "b" vom dem Wort "bytes", dann könnte ich mit dem Programm cut die Zeilen wie gewünscht Schneiden.
Ich gehe mal davon aus, Du bekommst den Quatsch in einer Datei -------------%--------------------%-------------------%------------------------- #!/usr/bin/perl -w use strict; ## Programm ungetestet.... my $dat = $ARGGV[0] or die "Usage: $0 <FILENAME>\n"; open DAT, $dat or die "Cannot open $dat $!"; while (<DAT>) { my($bytes) = $_ =~ m/.*bytes (\d*)/; print STDERR "Got $bytes bytes\n"; } close DAT; print "Ich habe fertig\n"; print "HTH\nVolker\n"; -------------%--------------------%-------------------%------------------------- HTH V.
On 22 Oct 2002, Heiner Iserloth wrote:
Antwort an: Re: Shell scripte Hallo Liste, vielen für die Antworten. Entschuldigung für die langen Zeilen (habe ein internes Mail Formular ausgewählt). Ich möchte eine Cisco Pix Firewall auf einem SuSE Linux Rechner mit "syslogd" loggen. Die Zeilen die gelogt sind sehr lang.
z.b. Oct 22 09:27:00 192.168.1.1 %PIX-6-101001: TCP connection 910452 faddr 192.168.1.1/80 gaddr 192.168.1.1/80 laddr 192.168.1.1/80 duration 0:00:01 bytes 4190 (TCP Reset-I)
Aus so einer Zeile möchte die Zahl hinter dem Wort "bytes" auslesen. Schön wäre die Zeichen Position von "b" vom dem Wort "bytes", dann könnte ich mit dem Programm cut die Zeilen wie gewünscht Schneiden.
wozu brauchst du die genaue Position noch? das geht doch alles viel einfacher. Perl Loesung hat schon jemand geschrieben: perl -ne 'print "$1\n" if m/.*\s+bytes\s+(\d+)\s+.*/;' file oder sed (aber nicht so tolerant): sed -ne 's/.* bytes \([^ ]*\).*/\1/p' file (beides funktioniert mit deinem Beispiel). Achim
Hallo, On Tue, 22 Oct 2002, Achim Hoffmann wrote:
On 22 Oct 2002, Heiner Iserloth wrote:
z.b. Oct 22 09:27:00 192.168.1.1 %PIX-6-101001: TCP connection 910452 faddr 192.168.1.1/80 gaddr 192.168.1.1/80 laddr 192.168.1.1/80 duration 0:00:01 bytes 4190 (TCP Reset-I)
Aus so einer Zeile möchte die Zahl hinter dem Wort "bytes" auslesen.
wozu brauchst du die genaue Position noch? das geht doch alles viel einfacher. Perl Loesung hat schon jemand geschrieben:
perl -ne 'print "$1\n" if m/.*\s+bytes\s+(\d+)\s+.*/;' file
oder sed (aber nicht so tolerant):
sed -ne 's/.* bytes \([^ ]*\).*/\1/p' file
sed -n 's/.* bytes \([0-9]\+\).*/\1/p' file awk '{print $18;}' < file Letzteres allerdings (so) nur, wenn die durch ' ' getrennten Felder in der Anzahl nicht variieren. Dann sollte aber: awk -F'bytes' '{split($2,a,/[^0-9]/); print a[2];}' < file trotzdem funktionieren... (hierbei ist 'a' ein Array, dessen erster Wert den 'Whitespace' vor den Zahlen enthaelt, daher 'print a[2]', und, achso, ja, $2 enthaelt die Zeile _ab_ (exklusive) 'bytes', also bei obiger Zeile ' 4190 (TCP...' ;)) Genrell wuerde ich sed und awk gegenueber perl bevorzugen, wenn der Prozess oefter gestartet werden soll... Falls es um die Auswertung eines Logfiles geht kommen alle 3 in Frage, da dann die Startzeit von perl weniger ins Gewicht faellt. Die 3 Varianten waeren also: sed -n '/TCP connection/s/.* bytes \([0-9]\+\).*/\1/p' awk -F'bytes' '/TCP connection/{split($2,a,/[^0-9]/); print a[2];}' perl -ne 'print "$1\n" if(/TCP connection.*\s+bytes\s+(\d+)\s+.*/);' Jeweils mit ' < logfile' danach... Oder 'cat log1 log2 ... | ' davor *g* Perl ist dabei am langsamsten (beim Starten), aber dann doch am flexiblesten. Fuer eine "einfache" und gleichbleibende Log-Zeile sind alle 3 Varianten erstklassig geeignet. Evtl. geht das aber mit awk auch noch eleganter, ich bin halt noch awk-Anfaenger *g* -dnh -- No sig today
Genrell wuerde ich sed und awk gegenueber perl bevorzugen, wenn der Prozess oefter gestartet werden soll...
hmm, im Zeitalter der zichGhz CPUs ist das wohl egal (Ausnahmen bestaetigen wie immer die Regel). sed ist aber schon lange um einiges langsamer als [gnm]awk :-(
Evtl. geht das aber mit awk auch noch eleganter, ich bin halt noch awk-Anfaenger *g*
LOL, perl-Spezialist und kein awk, das ist eigentlich unlogisch. Also ich halte es ungefaehr so (wenn die Performance keine Rolle spielt): awk fuer Tabellen (white-space odersonstwie delimitted, einfache Programmstrukturen und/oder Back/Forward Referenzen) sed fuer irgendwelche Streams, und einfache Substitutionen cut fast nie (das zaehlen ist mir einfach zu bloed, und Fortran-Sources habe ich keine mehr) tr, head, tail, wc meist in Pipes mit awk, sed perl fuer alles andere (insbesondere wenn zu erwarten ist dass es komplexer wird), man spart das Pipe-Gewurschtel :) Achim
participants (4)
-
Achim Hoffmann
-
David Haller
-
Heiner Iserloth
-
Kroll, Volker