
Hallo, Wie kann ich meine IP-Adresse Auslesen, die ich von T-Online bei jeder Einwahl dynamisch zugewiesen bekomme. Ich möchte nämlich eine HTML-Datei erstellen, die eine Weiterleitung auf meinen Rechner enthält. Ich benötige also nur die IP in Form von xxx.xxx.xxx.xxx. Oder gibt es ein Programm was diese Aufgabe übernehmen kann? Besten Dank Michael -- registered Linux user number 251669

Hallo, /sbin/ifconfig ppp0 | grep "inet addr:" | awk '{print $2}' | cut -c 6- | perl -pe 'chomp;' > /tmp/ip-adresse.txt diese kannst du dann mit cat zu einer html datei basteln, und z.B. per ncftpput hochladen aufn server z.B. cat /pfad/teil1derHTMLseite.tmp /tmp/ip-adresse.txt /teil2derHTMLseite.tmp > /tmp/index.html -- MfG Yann Wissenbach www : http://www.world-wide-wait.de http://www.vw-opel-ig.de mail : yann@world-wide-wait.de ICQ : 98297452 Linux - Life is too short for reboots

Yann Wissenbach wrote:
Meines Erachtens geht das noch viel einfacher: www.dyndns.org. Da bekommste einen DNS-Eintrag (z.B. rantanplan.dyndns.org). Jedesmal, wenn sich Dein Rechner einwählt, kannst Du mittels Script (ipcheck.py z.B.) den DNS-Server updaten. Dann brauchst Du in Deiner HTML-Seiter nur noch als Weiterleitung "http://rantanplan.dyndns.org/wasweissich/" angeben. Einen Nachteil hat die Sache: Wenn Du neu eingewählt bist, kann es je nach DNS-Cache sein, daß der Name noch auf die alte Adresse aufgelöst wird. Das gibt sich aber meistens innerhalb ein paar Minuten (vor allem, wenn man fleissig auf "Reload" Klickt :-) ) CU Werner -- "Grub first, then ethics." -- Bertolt Brecht

Hallo, Bitte lass das TOFU, Yann! On Sat, 02 Mar 2002, Yann Wissenbach wrote:
/sbin/ifconfig ppp0 | grep "inet addr:" | awk '{print $2}' | cut -c 6- | perl -pe 'chomp;' > /tmp/ip-adresse.txt
UARGL! Der Schrott ist wohl echt nicht auszurotten! Ich zaehle: grep + awk + cut + perl... Das ist (nach den Benchmarks die ich mal gemacht habe) die langsamste Variante ueberhaupt[1]. Besser: /sbin/ifconfig ppp0 | sed -n 's/.*addr:\([0-9\.]*\).*/\1/p'; -dnh [1] das script mit den diversen Varianten zum testen kannst du ggfs. gerne per PM haben... -- The goal of Computer Science is to build something that will last at least until we've finished building it. -- BSD fortune file

Guten Morgen, David Haller wrote:
Ack.
Besser:
/sbin/ifconfig ppp0 | sed -n 's/.*addr:\([0-9\.]*\).*/\1/p';
Allerdings habe ich mit den regulären Ausdrücken so meine Probleme - gerade mit sed. Ich habe bisher keine anständige Doku gefunden, die über die völlig trivialen Beispiele hinausgeht ("wer" gegen "was" austauschen usw.) Hast Du Doku dazu, die Du mir per PM zuschicken kannst ? Kennst Du GUTE Links ? Ich möchte gerne mit sed aus /etc/named.conf die beiden forwarders auslesen, also -snip- forwarders { 195.252.143.26; 194.192.187.132; }; -snap- Ich erhalte aber bestenfalls: 195.252.143.26 194.192.187.132; }; ^^^ das will ich NICHT ! Wie macht man das also ? ccD

Am Mit, 06 Mär 2002 schrieb Dennis Leist:
Wie und den ersten Strichpunkt schmeißt Du weg? Wie wäre sed -e 's/.*ders {\(.*\)}/\1/'|sed -e 's/;//g' Sind aber immer noch zwei sed Aufrufe, mit sed fällt mir auch gerade keine Möglichkeit ein, daß für eine beliebige Zahl von Forwardern in einemAufruf zu lösen, mit Perl sollte sowas gehen... Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen

Hallo, On Wed, 06 Mar 2002, Christoph Maurer wrote:
z.B. mittels: sed 's/[^0-9]*\([0-9.]*\);/\1 /g' Das heisst: gebe nur Zahlen + '.' aus, die nach bel. vielen nicht-Zahlen stehen (die \(\) gruppieren die IP und \1 ist dann der Rueckbezug auf den Inhalt in den \(\), und mach das ganze so oft wie moeglich ("global", wird durch die "option" g gemacht). Eine kompliziertere Version kommt mit der Nachhilfe von 'xargs echo' auch mit Zeilenumbruechen und diversem "Whitespace" klar (und auch mit der ersten Version wie oben): $ echo -e ' \tforwarders { \n\t \t195.252.143.26; \t\n\t\t194.192.187.132;\t \n\t}; \t' \ | sed -n 's/[^0-9]*\([0-9.]*\)/\1 /pg' | xargs echo 195.252.143.26 194.192.187.132 $ echo 'forwarders { 195.252.143.26; 194.192.187.132; };' \ | sed -n 's/[^0-9]*\([0-9.]*\)/\1 /pg' | xargs echo 195.252.143.26 194.192.187.132 Die Version unterscheidet sich von der ersten nur darin, dass erstens die Ausgabe mittels der Option -n unterdruecktwird, und dann explizit die Zeilen mit nem "Match" durch das p hinter s///p ausgegeben werden.
Geht auch einfacher: sed -e 's/.*ders {\(.*\)}/\1/;s/;//g' ^^^^^^^ zweiter Befehl nach dem s/// Alternativ kann man auch 2mal -e verwenden: sed -e 's/.*ders {\(.*\)}/\1/' -e 's/;//g'
s.o. natuerlich geht das, man muss nur die richtigen Muster finden ;) -dnh -- == Re: MS' rules for creating 8.3's out of "long filenames" ==

Am Mit, 06 Mär 2002 schrieb David Haller:
Ist . in sed was anderes als in anderen RegExpressions, bzw. müßte man nicht \. schreiben, oder fällt das in [] weg? Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen

Hallo, guck mal in meine Firewall von www.wolfgarten.com rein, da habe ich genau sowas realisiert. Sourcen liegen dem Downloadpaket bei... Gruß Sebastian

* Christoph Maurer schrieb am 07.Mär.2002:
Ist . in sed was anderes als in anderen RegExpressions, bzw. müßte man nicht \. schreiben, oder fällt das in [] weg?
in [] gehören nie \ rein, es sei denn Du meinst den \. Sonderbedeutungen innerhalb von [] haben nur ^ - und ]. ^ aber nur wenn es am Anfang steht, - wenn es zwichen zwei andere Zeichen steht und mit ] wird die Klammer geschlossen. Sind diese Zeichen selber gemeint, so darf ^ nicht am Anfang stehen, - muß am Anfang oder am Ende stehen und ] muß unmittelbar nach dem [ bzw. nach dem [^ stehen. Der . hat innerhalb von [] keine Sonderbedeutung, und der \ auch nicht. Bernd -- Was ist quoten? Quoten ist das Zitieren aus einer mail, der man antwortet. Und wie macht man es richtig? Zitate werden mit "> " gekennzeichnet. Nicht mehr als nötig zitieren. Vor den Abschnitten das Zitat, auf das man sich bezieht, mit einer Zeile Abstand oben und unten. |Zufallssignatur 12

* Dennis Leist schrieb am 06.Mär.2002:
Allerdings habe ich mit den regulären Ausdrücken so meine Probleme - gerade mit sed.
man 7 regex
Was willst Du wissen? Bei sed ist es so, daß ersetzen mit s/Suchmuster/Ersetzungsmuster/Modus geht. Außer s gibt es in sed noch anderes, aber habe ich außer y noch nie verwendet. Lohnt sich imho auch nicht mehr zu lernen. Für Umfangreicheres lernst Du besser perl. sed ließt immer Zeilenweise. Es darf somit kein Zeilenumbruch dazwichen sein. Mann kann da zwar auch was machen, indem man was in irgendwelche Buffer schreibt, aber da habe ich auch keine Ahnung von und wie gesagt, sowas macht man besser mit perl. Das folgende ist aber so oder so nicht verkehrt zu lernen, weil es so oder so ähnlich auch für perl, grep und andere gilt. Bei Suchmuster steht was und wie oft. Einzelne Abschnitte können mit \( ... \) geklammert werden. (Die Punkte gehören nicht zur Syntax) Was: Hier steht meist jedes Zeichen für sich selber. Etwa a - steht für a 1 - steht für 1 ( - steht für ( usw. aber: . - steht für jedes beliebige Zeichen außer Zeilenumbruch. \x - steht für x \\ - steht für \ \" - steht für " \[ - steht für [ \t - steht für ein TAB ^ - als erstes Zeichen steht für Zeilenanfang. $ - als letztes Zeichen steht für Zeilenende. \< - steht für Wortanfang \> - steht für Wortende Zu bemerken wäre \<wort steht für " wort" oder "\twort" oder "^wort" also gleichgültig ob wort am Anfang der Zeile steht, oder nach einem Blank oder nach einem Tab. Nicht aber für Vorwort, da hier wort nicht am Wortanfang steht. Genauso ist es bei ^ egal, ob die Zeile die erste im File überhaupt oder aber nach einem Zeilenumbruch ist. Was besonderes ist [...] Dies steht für alles was in der Klammer steht. So steht etwa a[bcd]e für abe oder ace oder ade, nicht aber für abbe oder ae oder abce. Immer nur genau eins aus der Klammer. Meist folgt dem [...] ein * aber das ist was anderes, darauf gehe ich später ein. Ohne diesem * also immer nur genau eins dieser Zeichen. Allerdings ist es nicht notwendig das ganze Alphabet hineinzuschreiben wenn man ein beliebigen Buchstaben meint. Es reicht zu sagen [a-z] Wenn es auch ein Großbuchstaben sein darf dann [a-zA-Z] nicht aber [a-z,A-Z] Das funktioniert zwar auch, aber auch das Komma würde funktionieren, was wahrscheinlich nicht gewollt ist. Auch dürfen da keine Leerzeichen drin stehen, es sei denn auch das Leerzeichen soll eine Möglichkeit sein. Auch darf das \ nicht verwendet werden, es sei denn auch der Backslash selber gehört zur Auswahl. Soll der - zur Auswahl gehören, so muß er ganz am Anfang stehen, oder ganz am Ende, etwa [0-9.+-] steht für eine Ziffer oder die Zeichen . oder + oder - Dabei steht das erste - für alle Zahlen von 0 bis 9, das zweite - aber für sich selber. [0-9+-.] hingegen stände für alle Zahlen 0 bis 9 und alle ASCII-Zeichen von + bis . Was in diesem Falle nur noch den , zusätzlich neben + . und - bedeuten würde, aber trotzdem nicht gemeint ist. Sollte die schließende Klammer zum Ausdruck gehören, so muß sie unmittelbar nach der öffnenden folgen. []] steht somit für ] allerdings, könnte man das auch einfacher mit ] haben. [])}>] steht für irgendeine schließende Klammer, egal ob rund, eckig, geschweift oder spitz. Wichtig hierbei, daß zuerst die eckige dasteht, sonst beendet die eckige die Auswahl. Um es nochmal klar zu machen: a[])}>]b steht für a]b oder a)b oder a}b oder a>b a[)}]>]b steht für a)>]b oder für a}>]b da die Auswahl mit dem ersten ] geschlossen wird und das nachfolgende > und ] stehen dann einfach für sich selber. Umgekehrt steht [^...] für alle Zeichen außer dem Zeilenumbruch, die nicht nicht in der Auswahl stehen. Alle Regeln von oben gelten auch hier. So steht [^abc] für alles außer a oder b oder c. [^a-z] für alles außer Kleinbuchstaben. [^-0-9] für alles außer Ziffern und dem - Zeichen. [^]h8] für alles außer ] h oder 8. Soll ^ in der Auswahl stehen, so darf es nicht am Anfang stehen. [a-z^] steht für alle Kleinbuchstaben und dem ^ Bei den negierten ist es egal. [^^a-z] steht für alles außer Kleinbuchstaben und dem ^ Zum Abschluß noch ein ganz schwieriger: []^-] steht für die Zeichen ] oder ^ oder - Eine andere Reihenfolge ist nicht möglich, da der ] am Anfang stehen muß, der ^ dort nicht stehen darf und das - nicht in der Mitte. Sonst hätten die jeweilige Zeichen Sonderbedeutungen. Das setzen wir noch einen drauf: ^[^][^][][^] steht für alle Zeichen außer den Zeichen [ ] und ^ am Zeilenanfang, gefolgt von genau eines dieser drei Zeichen. Das erste ^ steht außerhalb der [ ] Klammer und steht für den Zeilenanfang. Gefolgt wird es durch Durch die Auswahlklammer. Das erste Zeichen darin ist ein ^, es wird somit negiert. Das heißt die Zeichen in der Klammer dürfen nicht auftauchen. Da das erste Zeichen ] ist, ist es nicht die schließenden Klammer, sondern steht für sich in der Auswahl. Weiter steht in der Auswahl die öffnende Klammer und das ^ Innerhalb der Klammer hat die öffnende Klammer keine Bedeutung und steht wie jedes andere Zeichen für sich selber. Das zweite ] schließlich schließt die Klammer. Danach gibt es eine erneute Auswahlklammer. Das erste Zeichen ist hier kein ^. Es wird somit nicht negiert, sondern es muß eins dieser Zeichen folgen. Es sind die gleichen wie eben. Wieder folgt die schließende Klammer unmittelbar der öffnenden und steht für sich selber, das ^ steht nicht am Anfang und steht für sich selber, das [ so wie so. Das letzte Zeichen ist schließlich die schließende Klammer. Es gibt da noch etwas, nämlich: [[:alpha:]] steht für einen beliebigen Buchstaben. Genaugenommen steht [:alpha:] innerhalb der [...] Klammer für einen beliebigen Buchstaben. Es geht mithin auch [[:alpha:]23] was für einen beliebigen Buchstaben, 2 oder 3 gelten würde. Außer [:alpha:] gibt es natürlich noch anderes, nämlich: [:alnum:] für Buchstabe oder Zahl [:alpha:] für Buchstabe [:blank:] für Leerzeichen und Tab [:cntrl:] für ein Kontrollzeichen, eines der ersten 64 ASCII-Zeichen. [:digit:] Eine Ziffer 0-9 [:graph:] alles außer Kontrollzeichen und Blanks. [:lower:] ein Kleinbuchstabe [:print:] Alles außer Kontrollzeichen [:punct:] Für Satzzeichen [:space:] Neben Leerzeichen und Tab auch Seitenvorschub u.ä. [:upper:] Für Großbuchstaben [:xdigit:] Für HexadezimalZiffer. So, am Anfang habe ich gesagt, daß im Suchmuster steht, was und wie oft ersetzt werden soll. Das was habe ich oben geschrieben, fehlt noch das wieoft. Hierbei steht das wieoft unmittelbar hinter dem was. Nehmen wir mal als Beispiel das a. a steht einfach für sich selber. Das wie oft folgt unmittelbar: a\{2,5\} heißt 2 bis 5 mal. Einschließlich. Der Ausdruck steht somit für aa oder aaa oder aaaa oder aaaaa nicht aber für a oder aaaaaa Vorsicht: a \{2,5\} steht nicht für 2 bis 5 mal ein a, sondern für ein a gefolgt von 2 bis 5 Leerzeichen. a\{3\} steht für exakt drei mal ein a. Also für aaa, nicht aber für aa oder aaaa a\{2,\} steht für mindestens zwei mal ein a. Also für aa, aaa, aaaa usw. nicht aber für a. Auch möglich ist sowas: a\{0,3\} dies steht für null bis drei mal a. also für a oder aa oder aaa oder auch gar nichts. Das macht in einem Kontext durchaus Sinn: ab\{0,2\}c steht für ac oder abc oder abbc, nicht aber für abbbc Mit diesen \{...\} kann man zwar alles machen, aber doch recht umständlich. Daher gibt es ein paar Abkürzungen: * ist das Gleiche wie \{0,\} also beliebig viele, auch Null mal. + ist das Gleiche wie \{1,\} also beliebig viele, aber mindestens ein mal. ? ist das Gleiche wie \{0,1\} also höchstens einmal. Der allerhäufigste Fall, nämlich genau einmal ist besonders einfach, nämlich gar nichts. Wenn einem Zeichen gar nichts folgt, so ist exakt einmal damit gemeint. Habe ich ja hier auch schon mehrfach so angewendet und versteht sich fast von alleine. a steht für a, nicht für aa. Noch schnell zu obigen ein paar einfache Beispiele: ab*c steht für ac oder abc oder abbc oder abbbc oder abbbbc oder... ab+c steht für abc oder abbc oder abbbc oder ... nicht aber für ac ab?c steht für ac oder für abc nicht aber für abbc abc steht für abc und sonst nichts. Richtig interessant wird es, wenn ein Zeichen für wie oft nicht hinter ein Zeichen steht, daß für sich selber steht, sondern hinter eine Auswahl. So etwa steht [a-z]* für beliebig viele Kleinbuchstabe, auch keine, oder [0-9]+ steht für eine beliebige ganze Zahl. Will man eine führende Null ausschließen, so könnte es so lauten: [1-9][0-9]* Das schließt aber auch die 0 selber aus. Weiter kann man auch Gruppieren, und zwar mit \(...\) a\(bc\)*d steht für ad oder abcd oder abcbcd oder abcbcbcd, nicht aber für abd oder acd oder acbd oder abbcd oder abbccd. a\([bc]d\)+e steht für abde oder acde oder abdbde oder abdcde oder acdcde oder abdbdbde oder abdbdcde oder abdcdbde usw. nicht aber für ae oder abe oder ace oder ade oder abce oder abcde oder abdbcde Wie man oben gesehen hat, steht a\([bc]d\)+e auch für abdcde. Will man dies nicht, sondern nur a\(bd\)+e oder aber a\(cd\)+e also abde oder abdbde oder abdbdbde oder aber acde oder acdcde oder acdcdcde, nicht aber abdcde, also nicht mischen will, so geht das mit a\([bc]d\)\1*e Dabei steht \1 für das erste Auftreten von \(...\) in dem Suchmuster. Obiges nochmal etwas auseinaner genommen: Das Suchwort was gefunden wird beginnt mit exakt einem a, weil das a für sich selber steht und auch keine Mengenangabe folgt. Dann folgt ein \([bc]d\) Dies steht erst einmal für [bc]d was wiederum für bd oder für cd steht, denn in [...] steht eine Auswahl. Dem \(...\) folgt keine Mengenangabe, also steht es für exakt einmal. Gefolgt wird das ganze durch ein \1. Dies bedeutet, daß exakt das was in \(...\) wiederholt werden kann, und zwar beliebig oft durch wegen des nachfolgenden *. Wenn also \(...\) bd erkennt, so können noch beliebig viele bd, auch keine, dem ersten bd folgen, aber nichts anderes. Wenn das \(...\) hingegen ein cd erkannt hat, so können dem noch beliebig viele, auch keine bc folgen, aber kein bd oder irgend etwas anderes. Am Schluß steht noch ein e für sich selber. Wenn es mehere \(..\) in dem Suchmuster gibt, so steht \1 für die erste Klammer, \2 für die zweite usw. ACHTUNG: Ich weiß nicht, ob es für Dich wichtig ist, aber durch diese Möglichkeit ist das Suchmuster nicht mehr kontextfrei und es handelt sich nicht wirklich um einen regulären Ausdruck. Dies ist für Informatiker wichtig, nicht aber für Praktiker. Obiges Beispiel ginge auch noch Kontextfrei zu regeln, nicht aber folgendes: a\(b*\)c\1d Dies steht für acd oder abcbd oder abbcbbd oder abbbcbbbd oder abbbbcbbbbd nicht aber für abcd oder acbd oder abcbbd oder abbcbd. Hier ist der * mit im \(...\) das \1 steht somit für die exakte Anzahl der b. Wichtig ist noch das \| es steht für ein oder: ab\|cd steht für ab oder für cd. a\(bc|ef\)g steht somit für abcg oder für aefg Noch ein paar Beispiele: [1-9][0-9]*\|0 steht für eine beliebige ganze Zahl, ohne führende 0. \(+\|-\)?[1-9][0-9]*\|0 das gleiche mit Vorzeichen. \(+\|-\)?\([1-9][0-9]*\|0\) hier ist das Vorzeichen auch vor der 0 erlaubt. \(+\|-\)?\([1-9][0-9]*\|0\)\(.[0-9]+\)? Dezimalzahl Soweit zum Suchmuster. Das Ersetzungsmuster ist einfacher, da steht alles für sich selber außer & steht für den gesamten Suchausdruck, so wie er gefunden wurde und \1, \2 usw. steht für die jeweilige \(...\) Klammerung im Suchteil. \& steht für & und \\ für \. So, nun noch zum Modus. Steht da gar nichts, so ersezt sed pro Zeile nur das erste Auftreten des Suchmusters. Tritt das Suchmuster in der Zeile noch öfters auf, so bleiben alle anderen so wie sie sind. Steht im Modus eine Zahl, so wird nur das entsprechende Auftreten ersetzt. Steht dort hingegen ein g, so wird jedes Auftreten ersetzt. Normalerweise wird jede Zeile wieder ausgegeben. Hat sed die Option -n, so wird nichts ausgegeben, es sei denn, es wird dies mit dem Modus p gemacht. Taucht in diesem Fall ein p im Modus einer Ersetzung auf, so werden nur ersetzte Zeilen ausgegeben, andere nicht. Gilt alles nur für sed, speziell nur für das GNU-sed bei Linux. Bei grep, egrep, vim, perl usw. sieht es ähnlich, aber leider im Deteil oft anders aus. So haben bei sed \(, \{, \< und \| Sonderbedeutungen, während (, {, < und | für sich selber stehen. Bei manchen ist es genau umgekehrt. Auch gibt es nicht immer \{n,m\} usw. Probier doch einfach mal selber aus: echo 'irgend etwas' | sed 's/Suchmuster/Ersetzung/' und spiel damit rum. Die ' sind dafür da, damit nicht die shell schon was setzt. ' selber sollten dann aber nicht vorkommen. Bernd -- ROTFL = Rolling On The Floor, Laughing = Auf dem Boden wälzen, lachend. SCNR = Sorry, Could Not Resist = Sorry, Ich konte nicht wiederstehen. AFAIK = As Far As I Know = So weit ich weis|BTW = By The Way = Nebenbei bemerkt IMHO = In My Humble Opinion = meiner bescheidenen Meinung nach |Zufallssig. 9

Hallo, On Wed, 06 Mar 2002, Bernd Brodesser wrote:
Nein. Der Addressmechanismus von sed ist sehr maechtig, zusammen mit i, d, usw. kann man fast alles machen. z.B.: gebe nur die Bodies einer MBox aus: $ sed '/^From /,/^$/d' < irgendne.mbox d.h. loesche alles was du zwischen einem "^From ' und der naechsten Leerzeile findest. Oder man ersetzt den ganzen Block durch einen Hinweis: $ sed '/From /,/^$/c\ ==== header removed ====' < irgendne.mbox oder: $ sed '/From /,/^$/c\ ====\ headers have been removed\ contact privacy@foo.tld for more info\ ====' < irgendne.mbox (ja, diese Schreibweise inkl. den '\' ist wichtig!) Wie man sieht, funktioniert das ganze dann wie ein s/// auf mehreren Zeilen... Und ja, so sehr ich inzwischen perl mag, den Adressoperator vermisse ich oefter...
Das folgende ist aber so oder so nicht verkehrt zu lernen, weil es so oder so ähnlich auch für perl, grep und andere gilt.
Ack!
Bei Suchmuster steht was und wie oft. Einzelne Abschnitte können mit \( ... \) geklammert werden. (Die Punkte gehören nicht zur Syntax)
Wobei man da unterscheiden muss zwischen "basic" und "extended" Regular Expressions (RE) unterscheiden muss. Bei letzteren vertauschen sich die Bedeutungen von Sonderzeichen wie z.B. ( und \( sowie | und \|. "basic" RE verwenden z.B. sed, und grep, "extended" RE verwenden z.B. egrep (bzw. grep -E) und perl. Bsp: will man nach ein paar Woertern in () geklammert suchen geht das mit grep '(\(foo\|bar\|baz\))' egrep '\((foo|bar|baz)\)' Dabei ist jew. das aeussere Klammerpaar ["()" bei grep, "\(\)" bei egrep] die "literale" Klammer(zeichen), und das innere Paar ["\(\)" bei grep, "()" bei egrep] das mit der Sonderbedeutung der Gruppierung (von Alternativen z.B.).
Letzteres nur bei "basic" RE. Bei "extendend" steht \( fuer (.
usw.
[viel einer erstklassigen Erklaerung gesnippt]
a\{2,5\} heißt 2 bis 5 mal. Einschließlich. Der Ausdruck steht somit für aa oder aaa oder aaaa oder aaaaa nicht aber für a oder aaaaaa
Auch bei den {} bzw. \{\} gilt das oben zu () gesagte bzgl. "basic" RE und "extended" RE. Bsp: $ echo '110.111.100.1{1,2}' | sed 's/1{1,2}/n/g' 110.111.100.n Basic RE -> die {} sind "literale" { und } ohne Sonderbedeutung $ echo '110.111.100.1{1,2}' | sed 's/1\{1,2\}/n/g' n0.nn.n00.n{n,2} Basic RE -> die \{ \} haben die Sonderbedeutung $ echo '110.111.100.1{1,2}' | perl -pe 's/1{1,2}/n/g' n0.nn.n00.n{n,2} Extended RE -> die {} haben Sonderbedeutung $ echo '110.111.100.1{1,2}' | perl -pe 's/1\{1,2\}/n/g' 110.111.100.n Extended RE -> die \{ \} sind literale { und } ohne Sonderbedeutung [weiter Erstklassiges gesnippt]
Achtung: das + gibt's nicht immer, z.B. kennen sed und grep das nicht -- egrep und perl aber schon. [..]
Wenn es mehere \(..\) in dem Suchmuster gibt, so steht \1 für die erste Klammer, \2 für die zweite usw.
In perl werden $1 bis $9 statt \1 bis \9 verwendet...
ACK! Achso, noch ein Hinweis zu sed! Der "sed-Befehl" s ist als: s///[modus] dokumentiert, es kann aber jedes andere Zeichen, dass nicht in den Mustern / Ersetzungen vorkommt, verwendet werden, was z.B. bei Pfadersetzungen besonders praktisch ist: for f in /usr/..../foo-1.2/bar/*; do echo "$f" | sed \ 's/\/usr\/\(.*\)\/foo-1.2/\/opt\/foo-2.0\/\2/'; done ist kaum lesbar, da jedes / durch \ maskiert werden muss... Einfacher ist also z.B: for f in /usr/..../foo-1.2/bar/*; do echo "$f" | sed \ 's@/usr/\(.*\)/foo-1.2@/opt/foo-2.0/\2@'; done Hier steht also das @ fuer als "Trenner", also s@@@ statt s///. Haeufiger sieht man auch noch %,: als Trenner (z.B. in configure- scripten). Ich nehme besonders gern "exotische" Zeichen wie ¡¿§¶¯ als Trenner, da auch das @ doch "relativ" haeufig vorkommt (z.B. wenn man email- Adressen in ner Webseite austauschen will ;))... Ein dickes Danke, Bernd! So eine zusammenfassende Erklaerung ist auch dann noch praktisch, wenn man REs staendig verwendet ;) -dnh -- 11. The next best thing to having good ideas is recognizing good ideas from your users. Sometimes the latter is better. --- Eric S. Raymond, "The Cathedral and the Bazaar"

* David Haller schrieb am 06.Mär.2002:
On Wed, 06 Mar 2002, Bernd Brodesser wrote:
ja, d hatte ich vergessen. Benutze ich auch des öfteren.
Ja, man kann übrigens anstelle der Adressangabe über Suchstrings auch Zeilennummer angeben. Etwa 1,/^$/d löscht alles bis einschließlich der ersten Leerzeile. Wenn man aber alles von der ersten Zeile bis zum /^From/ gelöscht haben möchte, das /^From/ aber noch drin haben, so geht das zwar auch, aber dann muß man dies mit Buffer machen, oder?
Und ja, so sehr ich inzwischen perl mag, den Adressoperator vermisse ich oefter...
Wieso? es gibt doch .. bzw. ... Ok, man muß ein while drumherum basteln.
Mist, Du hast Recht. Habe ich mal wieder nicht ausprobiert. Mir war + so klar, und bei sed funktioniert es nicht. Merkwürdig das alles. So sehr ich reguläre Ausdrücke mag, so sehr stört es mich, daß es verschiedene Syntaxe gibt, auch wenn sie sich mitlerweile doch erheblich angeglichen haben, so gibt es immer noch Unterschiede. Was bringt eigentlichh noch ein egrep? Will sagen, was kann man mit egrep machen, was man mit grep (ohen -E) nicht machen kann? Ob ich nun ( oder \( sage ist doch letztendlich egal. Die Unterscheidung hat es doch nur gegeben, weil grep schneller war als egrep, weil die Syntaxfinessen natürlich auch Zeit kosten. Daher gibt es ja auch fgrep, daß keine reguläre Ausdrücke kennt. Es ist schneller. Ursprünglich lag grep zwichen fgrep und egrep. Aber ich sehe nicht mehr den Geschwindigkeitsvorteil von grep gegenüber egrep. Hm, mal mit time ausgetestet. Der Unterschied zwichen zwei mal exakt gleichen Kommandos ist teilweise größer als der zwichen egrep und fgrep, auch in meinem Mailarchiv. 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

Hallo, On Thu, 07 Mar 2002, Bernd Brodesser wrote:
Jep. Verwende ich aber kaum, da man erstmal die Zeilennummern kennen muss.
Hab kurz mal in man sed reingeschaut, scheint so, dass du's so machen musst.
Oh, kannte ich noch garnicht (ok, das .. fuer Zahlen schon, hab aber bisher nie nachgeschaut, was der '..'-operator eigentlich macht ;) *wiederwasgelernt* :)
Ja. Aber IMO reicht's eigentlich, zwischen "basic" und "extended" zu unterscheiden...
Was bringt eigentlichh noch ein egrep?
Ne andere Syntax ;)
Bei mir sind alle 3 Kommandos bis auf +-1ms gleich schnell, wenn ich ein "[e]grep -c '^From'" bzw. fgrep -c 'From ' auf das aktuelle suse-linux loslasse (sind 1833 mails)... Wo es _deutliche_ Unterschiede hagelt ist beim (ersten) einlesen der Datei (dann ist sie im cache) und bei der Ausgabe. Insbesondere die Ausgaben braucht relativ viel (zufaellig schwankend) Zeit... Also time mal mit einem >/dev/null oder -q oder -c ;) Ach ja, auf dem Archiv vom Feb. gegreppt schwankt die Zeit etwas mehr (so +- 10ms) die Datei ist aber auch gut 3.3 mal so gross wie die andere ;) Achso: die Schwankungen sind _beim gleichen_ grep! -dnh -- "Wenn sich bei manchen nur so schnell der Kopf mit Verstand füllen würde, wie diese gabeln mit meinen Siggs, dann gäbe es hier viel weniger Daus." [Woko° in dag°]

Hallo Liste, Ich wende mich mal wieder wegen einem sed-Problem an Euch: Zunächst bedanke ich mich bei Bernd für die Mail vom 06.03.2002. Es ist eine der Sorte: LaTex rüber, binden lassen und als Buch verkaufen ! Problem: Ich habe eine Text-Datei, die recht gross ist. In dieser ist eine ZEILE, die mit einem STRING beginnt. Auf diesen STRING folgt eine unbestimmte Anzahl von Leerzeichen (\t und ähnliches). Jetzt folgt eine Zahl - genau die will ich haben ! Beisp.: ZEILE ist: <begin> Dies ist der String: 123456789 <end> Laut Anleitung von Bernd Bernd Brodesser wrote: [...] und sonst gekürzter Fassung:
Ich nehme \([:blank:]*\), um beliebig mehrfaches Vorkommen von blank-Zeichen zu erkennen.
Weiter kann man auch Gruppieren, und zwar mit \(...\)
Wenn es mehere \(..\) in dem Suchmuster gibt, so steht \1 für die erste Klammer, \2 für die zweite usw.
Jo, will ich nutzen also: cat test.txt | sed 's/.*Dies ist der String:\([:blank:]*\)\([1-9]*\)/\3/g' Leider führt das nicht zum gewünschten Ergbebnis: <Ausgabe> 123456789 </Ausgabe> Man beachte die voranstehenden Leerzeichen ! Die will ich nicht haben. Auch möchte ich die Text-Datei nicht zweimal durch sed schicken, einmal zum Leerzeichen entfernen, das zweite zum Suchen der Zahl. Ich würde es gerne in EINEM Kommando haben. Wer weiss Rat ?

* Dennis Leist schrieb am 26.Apr.2002:
Ich nehme \([:blank:]*\), um beliebig mehrfaches Vorkommen von blank-Zeichen zu erkennen.
cat test.txt | sed 's/.*Dies ist der String:\([:blank:]*\)\([1-9]*\)/\3/g' ^
Nimm hier mal 2 statt 3. Wundert mich, daß da überhaupt was rauskommt, Du hast doch nur 2 \(...\) Klammern definiert. So sollte es funktionieren: cat test.txt | sed 's/.*Dies ist der String:\([:blank:]*\)\([1-9]*\)/\2/g' Die erste der beiden Klammern ist aber unnötig, Du brauchst sie doch niergends: cat test.txt | sed 's/.*Dies ist der String:[:blank:]*\([1-9]*\)/\1/g' Weiterhin ist cat unnötig, die Datei kann man auch sed mitgeben: sed 's/.*Dies ist der String:[:blank:]*\([1-9]*\)/\1/g' test.txt Das .* am Anfang ist überflüssig. sed 's/Dies ist der String:[:blank:]*\([1-9]*\)/\1/g' test.txt Wenn ich Dich richtig verstanden habe, dann soll der Text "Dies ist der String:" immer am Zeilenanfang stehen. Dann sollte man das auch so sagen. Außerdem kann er dann nicht mehrfach auftreten, so daß das g überflüssig ist. sed 's/^Dies ist der String:[:blank:]*\([1-9]*\)/\1/' test.txt Ich habe das jetzt nicht überprüft. Hoffentlich stimmt es so. Bernd -- Welches Buch ist zu empfehlen? Schon mal bei SuSE vorbeigesehen? http://www.suse.de/de/products/books/index.html oder die Empfehlungen der SuSE-Entwickler auf dem eigenen Rechner? file:///usr/share/doc/sdb/de/html/literatur.html |Zufallssignatur 5

Hallo Dennis, * Dennis Leist schrieb am 26.Apr.2002:
Ja, so ist es, wenn man es nicht überprüft. Man übersieht einfach was. Du mußt das [:blank:] in einer [..] Umgebung setzen. Richtig ist: sed 's/^Dies ist der String:[[:blank:]]*\([1-9]*\)/\1/' test.txt Es wird jede Zeile ausgegeben und die Zeilen, auf denen das Muster zutrifft werden geändert. Willst Du das? Wenn Du nur die Zeilen haben willst, auf denen das Muster zutrift, die andern aber nicht, dann mußt Du sed sagen, daß es nicht automatisch ausdrucken soll, (das geht mit der Option -n) und jeder Zeile, die gefunden wird, soll ausgedruckt werden, daher ein p. sed -n 's/^Dies ist der String:[[:blank:]]*\([1-9]*\)/\1/p' test.txt Bernd -- Bei Fragen an die Liste erst mal nachschauen, ob es diese Frage nicht schon einmal gegeben hat. Ein Archiv der Liste findest Du auf: http://lists.suse.com/archives/suse-linux |Zufallssignatur 7

Hallo, Am Mittwoch, 6. März 2002 06:08 schrieb Dennis Leist:
Ich meine, eine Investition, die sich wirklich lohnt: "sed & awk - kurz & gut", von Arnold Robbins ISBN: 3-89721-226-9 8,- Euro (Bitte nicht verwechseln mit dem dicken "sed & awk" für 40 Euro!) Das hab' ich ständig neben der Tastatur liegen. Gruß Bertram -- Bertram Scharpf <b.scharpf@tesionmail.de>

Am Mit, 06 Mär 2002 schrieb Bertram Scharpf:
Das dicke sed & awk ist wirklich ausführlich und sehr brauchbar, das kleine kenne ich nicht. IMHO sollte man nur überlegen, ob man nicht lieber gleich perl nimmt, da braucht man nur ein Programm und eine Syntax zu lernen und hat trotzdem sämtliche Funktionalitäten von sed und awk (+ vieles mehr). Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen

Moin Christoph, * Christoph Maurer schrieb am 06 Mar 2002:
Jeffrey E. F. Friedl "Mastering Regular Expressions" O'Reilly, ISBN 9781565922570 gibts aber auch auf deutsch. Behandelt Regex'es und die verschiedenen Sprachdialekte von perl, sed, awk usw. Gruß, Sebastian -- Do not meddle in the affairs of sysadmins, for they are subtle and quick to anger. Sebastian Helms - http://www.helms.sh - mailto:mail@helms.sh (PGP welcome) SuSE-Linux-Mailinglisten-FAQ: http://www.helms.sh/faq/

Hallo, * On Sat, Mar 02, 2002 at 02:38 PM (+0100), Michael Zenke wrote:
Wie kann ich meine IP-Adresse Auslesen, die ich von T-Online bei jeder Einwahl dynamisch zugewiesen bekomme.
Zum Beispiel über "ifconfig": ifconfig ppp0 | grep inet | cut -d : -f 2 | cut -d \ -f 1 Ggf. musst Du den Namen des Devices noch anpassen (also statt "ppp0"). HTH! Gruß, Steffen

Hallo, Michael Zenke:
Wie kann ich meine IP-Adresse Auslesen, die ich von T-Online bei jeder Einwahl dynamisch zugewiesen bekomme. Ich möchte nämlich eine HTML-Datei
Geht einfacher. 1. Bei erfolgreicher Einwahl wird die ip von /etc/ppp/ip-up an ./ip-up.local weitergereicht. Häng dein Programm da rein, die IP steht in $4. Ändere nix an der ip-up, sondern nur an der ip-up.local. oder 2. Benutze eine Client für dyndns.org, dann kannst du dir solche Klimmzüge sparen und bist einfach per meinkiste.dyndns.org zu erreichen. Gruß, Ratti

Hallo, /sbin/ifconfig ppp0 | grep "inet addr:" | awk '{print $2}' | cut -c 6- | perl -pe 'chomp;' > /tmp/ip-adresse.txt diese kannst du dann mit cat zu einer html datei basteln, und z.B. per ncftpput hochladen aufn server z.B. cat /pfad/teil1derHTMLseite.tmp /tmp/ip-adresse.txt /teil2derHTMLseite.tmp > /tmp/index.html -- MfG Yann Wissenbach www : http://www.world-wide-wait.de http://www.vw-opel-ig.de mail : yann@world-wide-wait.de ICQ : 98297452 Linux - Life is too short for reboots

Yann Wissenbach wrote:
Meines Erachtens geht das noch viel einfacher: www.dyndns.org. Da bekommste einen DNS-Eintrag (z.B. rantanplan.dyndns.org). Jedesmal, wenn sich Dein Rechner einwählt, kannst Du mittels Script (ipcheck.py z.B.) den DNS-Server updaten. Dann brauchst Du in Deiner HTML-Seiter nur noch als Weiterleitung "http://rantanplan.dyndns.org/wasweissich/" angeben. Einen Nachteil hat die Sache: Wenn Du neu eingewählt bist, kann es je nach DNS-Cache sein, daß der Name noch auf die alte Adresse aufgelöst wird. Das gibt sich aber meistens innerhalb ein paar Minuten (vor allem, wenn man fleissig auf "Reload" Klickt :-) ) CU Werner -- "Grub first, then ethics." -- Bertolt Brecht

Hallo, Bitte lass das TOFU, Yann! On Sat, 02 Mar 2002, Yann Wissenbach wrote:
/sbin/ifconfig ppp0 | grep "inet addr:" | awk '{print $2}' | cut -c 6- | perl -pe 'chomp;' > /tmp/ip-adresse.txt
UARGL! Der Schrott ist wohl echt nicht auszurotten! Ich zaehle: grep + awk + cut + perl... Das ist (nach den Benchmarks die ich mal gemacht habe) die langsamste Variante ueberhaupt[1]. Besser: /sbin/ifconfig ppp0 | sed -n 's/.*addr:\([0-9\.]*\).*/\1/p'; -dnh [1] das script mit den diversen Varianten zum testen kannst du ggfs. gerne per PM haben... -- The goal of Computer Science is to build something that will last at least until we've finished building it. -- BSD fortune file

Guten Morgen, David Haller wrote:
Ack.
Besser:
/sbin/ifconfig ppp0 | sed -n 's/.*addr:\([0-9\.]*\).*/\1/p';
Allerdings habe ich mit den regulären Ausdrücken so meine Probleme - gerade mit sed. Ich habe bisher keine anständige Doku gefunden, die über die völlig trivialen Beispiele hinausgeht ("wer" gegen "was" austauschen usw.) Hast Du Doku dazu, die Du mir per PM zuschicken kannst ? Kennst Du GUTE Links ? Ich möchte gerne mit sed aus /etc/named.conf die beiden forwarders auslesen, also -snip- forwarders { 195.252.143.26; 194.192.187.132; }; -snap- Ich erhalte aber bestenfalls: 195.252.143.26 194.192.187.132; }; ^^^ das will ich NICHT ! Wie macht man das also ? ccD

Am Mit, 06 Mär 2002 schrieb Dennis Leist:
Wie und den ersten Strichpunkt schmeißt Du weg? Wie wäre sed -e 's/.*ders {\(.*\)}/\1/'|sed -e 's/;//g' Sind aber immer noch zwei sed Aufrufe, mit sed fällt mir auch gerade keine Möglichkeit ein, daß für eine beliebige Zahl von Forwardern in einemAufruf zu lösen, mit Perl sollte sowas gehen... Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen

Hallo, On Wed, 06 Mar 2002, Christoph Maurer wrote:
z.B. mittels: sed 's/[^0-9]*\([0-9.]*\);/\1 /g' Das heisst: gebe nur Zahlen + '.' aus, die nach bel. vielen nicht-Zahlen stehen (die \(\) gruppieren die IP und \1 ist dann der Rueckbezug auf den Inhalt in den \(\), und mach das ganze so oft wie moeglich ("global", wird durch die "option" g gemacht). Eine kompliziertere Version kommt mit der Nachhilfe von 'xargs echo' auch mit Zeilenumbruechen und diversem "Whitespace" klar (und auch mit der ersten Version wie oben): $ echo -e ' \tforwarders { \n\t \t195.252.143.26; \t\n\t\t194.192.187.132;\t \n\t}; \t' \ | sed -n 's/[^0-9]*\([0-9.]*\)/\1 /pg' | xargs echo 195.252.143.26 194.192.187.132 $ echo 'forwarders { 195.252.143.26; 194.192.187.132; };' \ | sed -n 's/[^0-9]*\([0-9.]*\)/\1 /pg' | xargs echo 195.252.143.26 194.192.187.132 Die Version unterscheidet sich von der ersten nur darin, dass erstens die Ausgabe mittels der Option -n unterdruecktwird, und dann explizit die Zeilen mit nem "Match" durch das p hinter s///p ausgegeben werden.
Geht auch einfacher: sed -e 's/.*ders {\(.*\)}/\1/;s/;//g' ^^^^^^^ zweiter Befehl nach dem s/// Alternativ kann man auch 2mal -e verwenden: sed -e 's/.*ders {\(.*\)}/\1/' -e 's/;//g'
s.o. natuerlich geht das, man muss nur die richtigen Muster finden ;) -dnh -- == Re: MS' rules for creating 8.3's out of "long filenames" ==
participants (13)
-
B.Brodesser@t-online.de
-
Bertram Scharpf
-
Christoph Maurer
-
David Haller
-
Dennis Leist
-
Michael Zenke
-
Ratti
-
Sebastian Helms
-
Sebastian Wolfgarten
-
Steffen Moser
-
Thorsten Haude
-
Werner Jansen
-
Yann Wissenbach