Hallo, [Zitate passend umsortiert] Am Sam, 18 Nov 2006, Andreas Winkelmann schrieb:
Am Friday 17 November 2006 23:35 schrieb David Haller:
# netstat -ant|sed -n '/^tcp\s*\d*\s*\d*\s*[^\s]*:25\s.*ESTABLISHED/p'|wc -l
^^^^^^
Das \s, \d usw. sind keine POSIX-REs sondern perlre.
Ja, da hast Du recht. Es funktioniert aber auf halbwegs aktuellen Systemen. Und ich war zu faul für "[ \t]" oder. "[0-9]" oder noch schlimmeres.
Solche (neuen!!) GNUismen zaehlen nicht! Ausserdem: deine RE kollabiert eh zu nix. Schauen wir doch mal: \s* 0 oder mehr Space \d* 0 oder mehr Zahlen \s* 0 oder mehr Space \d* 0 oder mehr Zahlen \s* 0 oder mehr Space [^\s]* 0 oder mehr ! Space Kurz: 0 oder mehr Zahlen und Spaces und nicht-Spaces. Also 0 oder irknwas. Also egal. Dein Muster wird erst durch den Einsatz von '+' (ggfs. mit '' davor) sinnvoll. Ok, durch die Reihenfolge der Typen fischst du evtl. (zufaellig?) doch das Richtige raus, sinnvoll ist die RE dennoch nicht sonderlich (s.u.). POSIX/SUS konform, mit Zeichenklassen: | sed -n '/^tcp[[:space:]]+.*[^[:space:]]+:25[[:space:]]+ESTABLISHED/p' Traditionell (ohne + und ohne POSIX-Zeichenklassen), laeuft ueberall: | sed -n '/^tcp[ ][ ]*.*[^ ][^ ]*:25[ ][ ]*ESTABLISHED/p' In den [] steht jew. ein Space und ein Tab. Oder wolltest du nur auf die "Foreign Adress" filtern? Wie waere es mit: | sed -n '/^tcp[^:]*:[^:]*:25[ ][ ]*ESTABLISHED/p' Oder noch einfacher (und laeuft ueberall, wo's ein awk gibt): netstat -ant | awk '$5 ~ /:25$/{print;}' Und was lernen wird daraus? "Know thy tools!" Die awk Variante ist IMO mit Abstand am einfachsten :-P
Siehe: man 7 regex
Hmm:
$ man sed ... SEE ALSO ... perlre(1), ...
dh@slarty[3]: ~ (0)$ man -7 sed | grep perl Reformatting sed(1), please wait... dh@slarty[3]: ~ (1)$ sed --version | head -n 1 GNU sed version 3.02 dh@slarty[3]: ~ (0)$ ^ Exitcode des vorangegangenen Befehls Achso: 'man 7 regex' muss man so oder so kennen (noch besser: koennen), schon wg. ed, grep und v.a. den vielen anderen Tools die (POSIX-) (Basic|Extended) REs verwenden (procmail, mutt, vi(m), awk, emacs...). AFAIK verwenden auch diverse GUI-Tools (krename, kate, ...?) eben diese RE-Syntax.
Abgesehen davon, wieso sollte man nicht neue Funktionen, die neuere Programmversionen mitbringen auch nutzen?
Weil du damit fast ueberall sonst auf die Fresse fliegst? Wenn _DU_ das verwendest, ok, wenn du weisst wo. Aber in einer Mail (hier und anderswo) sollte ein Hinweis (s.o.) auf GNUismen usw. mit dazu (nach bestem Wissen und Gewissen ;). Wenn du's nicht besser weisst, auch einen wie "evtl. nur mit aktuellem GNU-Dingens unter Linux" o.ae. Denn sowas wie z.B. 'killall irgendwas' hat auf gewissen Systemen "interessante" Effekte (unter Linux kann man den Effekt mit der Tastenkombination "Sysrq+i" oder gar "Sysrq+l" hervorrufen!), eben das zu tun, was der Name aussagt (i.Ggs. zum von Linux gewohnten Verhalten von killall)... Bei anderen Befehlen sind die Auswirkungen meist weniger schlimm, aber ggfs. ebenso unerfreulich (z.B. wenn ein mit $aktuellem-GNU-Dingens unter Linux geschriebenes und getestetes Script $anderswo (Webhoster z.B.) nicht das macht, was es soll)... BTW: Kenn GNU find eigentlich inzwischen die '{}+' Syntax? Da sind z.B. die BSD "find"-Varianten deutlich besser (bei GNU muss man stattdessen '-print0 | xargs -r -0' verwenden, was auch wieder Probleme machen kann)... HTH, HAND, etc. -dnh PS: Ein Hinweis im OP wie "geht nur mit einem aktuellen(!) GNU sed" etc. laesst mich verstummen... Aber andererseits reite ich einfach ab und an gerne auf solchen Details herum. -- "Ich mach mal den Vollquottel Wegen verglkeich!" [Woko° in dag°] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org