Hallo, Am Mon, 22 Mar 2004, Ulrich Klenk schrieb:
David Haller schrieb:
Am Mon, 22 Mar 2004, Ulrich Klenk schrieb:
/sbin/ifconfig ppp0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://' > /tmp/ip-nr
*UARGH* grep | awk, grep | sed, sed | awk und awk | sed Pipes sind _IMMER_ ueberfluessig!
Nach dem "useless use of cat"-Award wollte ich den "useless use of pipes"-Award starten :-))
Nein, das Problem sind nicht die Pipes, sondern dass man Tools verwendet, die "Obermengen" der Tools davor oder dahinter sind. Grob gesagt gilt eben (fast immer, siehe den Kommentar "awk must be good for something" in einer der perl-manpages): {grep,cut} < sed < awk < perl d.h. sobald auch nur *ein* sed auftaucht sind _alle_ grep und cut komplett durch _ein_ sed ersetzbar. Analoges gilt, wenn ein "awk" auftaucht fuer grep, cut und sed. Und erst Recht bei perl. Beispiele, warum und wie o.g. Pipekonstruktion durch sed oder awk ersetzt werden kann hab ich ja nebenan gemailt. Und Sachen wie sed | sed, sed | awk, awk | perl (usw.) sind natuerlich besonders sinnfrei. Dass man, wenn man "einmalig" was im Terminal bastelt, sowas wie oben zusammenflickt, das ist verstaendlich und ok, das mache ich auch (manchmal, immer weniger), aber man sollte *wissen, dass* man grad was umstaendliches / unsauberes macht. Auf das Wissen um diese Tatsache kommt es mir an. Und daraus folgt IMO, dass man solche "unsauberen" Sachen (ich nenne es gerne auch mal "Unfug") nicht oeffentlich weiterverbreiten sollte. Denn sonst landet das dann eben in Archiven und solche Unsaeglichkeiten sind dann kaum mehr auszurotten, weil sie eben staendig von $suchmaschine gefunden werden und weiterverbreitet werden. Was meine ~/.bash_history (teils komplexeren) Wahnsinnskonstrukten birgt ist nicht mehr feierlich -- aber die bleiben auch nur dort. Was ich also eigentlich sagen wollte, ist, dass _immer_ wenn man die tools wie oben fashlc verwendet, dann sollte im Hinterkopf ein Warnlicht angehen, dass man grad was "faslch" macht... Und wenn man dann z.B. hier ne Antwort schreibt, dann sollte man das Warnlicht beachten und zusaetzlich noch ne Warnsirene angehen... Aehm, "faslsch" meint hier jeweils sowas wie: "Hey! Das geht doch alles komplett mit {sed,awk,perl}, wieso dann noch das grep/cut vorher/nachher? (bzw. skaliert nach o.g. "Reihenfolge" der Tools).
Und genaugenommen war der obige Code-Auszug nur eine Demonstration, das die http://allwissende.muellhal.de/ eine schnelle Lösung gebracht hätte... wenn es auch wie bei Linux üblich viele schöne und schönere Lösungen gibt...
For every complex problem, there is a solution that is simple, neat, and wrong. -- H. L. Mencken
siehe http://www.google.de/search?hl=de&ie=UTF-8&oe=UTF-8&q=linux+ip+tdsl+auslesen&meta=
s.o. Eben deswegen will man solchen Unfug wie o.g. grep | sed | cut nicht. Aber, sei getroestet, es wurden hier gerade zu dieser Frage (naja, zur eigenen IP, "inet addr") auch noch viel schlimmere Konstrukte (z.B. mit einer 'grep | awk | cut | perl' Kombination *schauder*) gemailt... Achso, das alles ist nicht persoenlich gemeint. Aber gerade eine IP aus der Ausgabe von ifconfig herauszusuchen ist ein so haeufiges und gutes Beispiel wie man es nicht machen sollte... Da konnte ich nicht anders... -dnh -- If you haven't got time to RTFM, you haven't got time to whine on this mailing list.