Script-Frage, löschen ab bestimmtem Zeichen
Hallo, ich habe eine 4MB große Textdatei vorliegen, in der ich ab dem Zeichen "=" den kompletten Rest jeder Zeile löschen möchte. Mit sed -e 's/=/''/g' de >de1 lösche ich nur das Gleichheitszeichen, aber nicht den Rest. Ich habe schon mit $ als Zeilenende herumgespielt. Komme jedoch nicht weiter. Ist $ nur bei awk das Zeichen für das Zeilenende? Als nächste Aufgabe steht dann an, ganze Zeile zu löschen die ein bestimmtes Zeichen erhalten. Dass sollte ja dann auch mit grep gehen, oder? Gruß Thomas
Am Mittwoch, 6. April 2005 16:13 schrieb Thomas Rippler:
ich habe eine 4MB große Textdatei vorliegen, in der ich ab dem Zeichen "=" den kompletten Rest jeder Zeile löschen möchte.
sed -e 's/=/''/g' de >de1 lösche ich nur das Gleichheitszeichen, aber nicht den Rest. sed -e 's/=.*$//g' de >de1
Als nächste Aufgabe steht dann an, ganze Zeile zu löschen die ein bestimmtes Zeichen erhalten. Dass sollte ja dann auch mit grep gehen, oder? grep -v ...
Hallo, Am Wed, 06 Apr 2005, Thomas Rippler schrieb:
ich habe eine 4MB große Textdatei vorliegen, in der ich ab dem Zeichen "=" den kompletten Rest jeder Zeile löschen möchte.
Mit sed -e 's/=/''/g' de >de1 lösche ich nur das Gleichheitszeichen, aber nicht den Rest.
sed 's/=.*//'
Als nächste Aufgabe steht dann an, ganze Zeile zu löschen die ein bestimmtes Zeichen erhalten.
sed '/=/d' Loescht alle Zeilen in denen ein '=' vorkommt. -dnh -- Dag° Hier bin Ich Kasper , hier darf Ich's sein. [WoKo in dag°]
Hallo, ich hab in meiner fstab einige Verzeichnisse von verschiedenen Partitionen zu einer Platte (virtuell) dazu gemountet um der Einfachkeit halber extern mit einem Rutsch auf alle zugreifen zu können. Das klappt gut wenn ich via Samba oder NFS darauf zugreife. Nun hab ich aber die Platte auch virtuell in mein home Verzeichnis hinein gemountet was dazu führt, dass die physischen Inhalte der Platte zwar zu sehen sind, die darin enthaltenen weiteren virtuellen gemounteten Verzeichnisse nicht. Hab ich da einen Fehler gemacht oder geht dieses Form des Kaskadierens einfach nicht (wenn ja wie würde es gehen)? THX Günter -- Handyrechnung zu hoch? Tipp: SMS und MMS mit GMX Seien Sie so frei: Alle Infos unter http://www.gmx.net/de/go/freesms
Hallo, NFS zeigt von Hause aus nur die Dateien eines Mountpoints an. Ich glaube im Linux-Magazin gabs da mal einen Artikel der das unteranderem auch beschrieben hat. Dadurch wird verhindert das man "ausversehen" mehr Dateien freigibt als man will. Die einzigste Lösung die ich kenne ist, das man jede Partition extra freigibt. Mit freundlichen Grüßen A.Gegner
Hallo, ich hab in meiner fstab einige Verzeichnisse von verschiedenen Partitionen
zu einer Platte (virtuell) dazu gemountet um der Einfachkeit halber extern
mit einem Rutsch auf alle zugreifen zu können. Das klappt gut wenn ich via
Samba oder NFS darauf zugreife. Nun hab ich aber die Platte auch virtuell in mein home Verzeichnis hinein gemountet was dazu führt, dass die physischen Inhalte der Platte zwar zu sehen sind, die darin enthaltenen weiteren virtuellen gemounteten Verzeichnisse nicht. Hab ich da einen Fehler gemacht oder geht dieses Form
des Kaskadierens einfach nicht (wenn ja wie würde es gehen)?
THX Günter
Hallo, ich hab in meiner fstab einige Verzeichnisse von verschiedenen Partitionen zu einer Platte (virtuell) dazu gemountet um der Einfachkeit halber extern mit einem Rutsch auf alle zugreifen zu können. Das klappt gut wenn ich via Samba oder NFS darauf zugreife. Nun hab ich aber die Platte auch virtuell in mein home Verzeichnis hinein gemountet was dazu führt, dass die physischen Inhalte der Platte zwar zu sehen sind, die darin enthaltenen weiteren virtuellen gemounteten Verzeichnisse nicht. Hab ich da einen Fehler gemacht oder geht dieses Form des Kaskadierens einfach nicht (wenn ja wie würde es gehen)? THX Günter -- Sparen beginnt mit GMX DSL: http://www.gmx.net/de/go/dsl
Hallo,
sed '/=/d'
Loescht alle Zeilen in denen ein '=' vorkommt.
so, das habe ich jetzt geschafft. Doch trotz einer ausführlichen Erklärung (Linux Profitools, Add.Wesley) bekomme ich es nicht hin, das diese Bedingung von eben negiert wird. Ich möchte jetzt also alle Zeile löschen, die einen bestimmtem Buchstaben NICHT enthalten. Ich bekomme maximal hin, dass meine Befehle auf den ersten Buchstaben der Zeile Auswirkungen haben. Die Krönung wäre noch eine ODER-Bedingung nach dem Muster. Lösche die Zeile falls kein "e" oder "E" enthalten ist. Geht das mit sed überhaupt oder muß ich mich jetzt in awk einarbeiten? Gruß Thomas
Am Sonntag, 10. April 2005 02:55 schrieb Thomas Rippler:
Hallo,
sed '/=/d'
Loescht alle Zeilen in denen ein '=' vorkommt.
so, das habe ich jetzt geschafft. Doch trotz einer ausführlichen Erklärung (Linux Profitools, Add.Wesley) bekomme ich es nicht hin, das diese Bedingung von eben negiert wird.
Man muss ja nicht alles mit sed machen.
Ich möchte jetzt also alle Zeile löschen, die einen bestimmtem Buchstaben NICHT enthalten.
grep -v =
Ich bekomme maximal hin, dass meine Befehle auf den ersten Buchstaben der Zeile Auswirkungen haben. Die Krönung wäre noch eine ODER-Bedingung nach dem Muster. Lösche die Zeile falls kein "e" oder "E" enthalten ist. Geht das mit sed überhaupt oder muß ich mich jetzt in awk einarbeiten?
Alle Zeilen löschen die weder e noch E enthalten: grep -v -e "[eE]" -- Machs gut | http://www.iivs.de/schwinde/buerger/tremmel/ | http://packman.links2linux.de/ Manfred | http://www.knightsoft-net.de
Hallo Manfred,
Man muss ja nicht alles mit sed machen.
ja, hast ja recht. :-) War ein typischer Fall von Verbohrtheit in eine Problemlösung. Dabei habe ich im Threadstart sogar schon selber davon gesprochen, dass ich für den Rest grep verwenden möchte.
Alle Zeilen löschen die weder e noch E enthalten: grep -v -e "[eE]"
Ich hab es jetzt so gelöst. grep -i "e" datei >datei1 -i sucht dabei unabhängig nach Groß- und Kleinbuchstaben. Diese Anmerkung war jetzt natürlich nicht für Manfred gedacht sondern eher fürs Archiv :-) Nochmals, vielen Dank an alle. Gruß Thomas
Hallo, Am Sun, 10 Apr 2005, Thomas Rippler schrieb:
sed '/=/d'
Loescht alle Zeilen in denen ein '=' vorkommt.
so, das habe ich jetzt geschafft. Doch trotz einer ausführlichen Erklärung (Linux Profitools, Add.Wesley) bekomme ich es nicht hin, das diese Bedingung von eben negiert wird. Ich möchte jetzt also alle Zeile löschen, die einen bestimmtem Buchstaben NICHT enthalten. Ich bekomme maximal hin, dass meine Befehle auf den ersten Buchstaben der Zeile Auswirkungen haben.
?
Die Krönung wäre noch eine ODER-Bedingung nach dem Muster. Lösche die Zeile falls kein "e" oder "E" enthalten ist.
sed '/[eE]/!d' Oder: sed -n '/[eE]/p' ==== man sed ==== After the address (or address-range), and before the com mand, a ! may be inserted, which specifies that the com mand shall only be executed if the address (or address- range) does not match. ====
Geht das mit sed überhaupt oder muß ich mich jetzt in awk einarbeiten?
Aber klar geht das ;) --
We're already nostalgic about The Week You Got Your Eyes Fixed. "Well, not really so much that week as what followed, The Month Matt Discovered Girls. *Big* chunk of delayed puberty he went through there, as soon as he could see what they look like." - Peter da Silva and adb [stolen from Matt's sig]
Hallo David,
Die Krönung wäre noch eine ODER-Bedingung nach dem Muster. Lösche die Zeile falls kein "e" oder "E" enthalten ist.
sed '/[eE]/!d'
==== man sed ==== After the address (or address-range), and before the com mand, a ! may be inserted, which specifies that the com mand shall only be executed if the address (or address- range) does not match. ====
auf die Idee das Kommando zu negieren wäre ich wohl nie gekommen. Ich glaube mir fehlt das auch noch das Auge, man-pages richtig zu lesen. Wieder etwas dazu gelernt. Gruß Thomas
Hallo, Am Sun, 10 Apr 2005, Thomas Rippler schrieb:
Die Krönung wäre noch eine ODER-Bedingung nach dem Muster. Lösche die Zeile falls kein "e" oder "E" enthalten ist.
sed '/[eE]/!d'
==== man sed ==== [..] auf die Idee das Kommando zu negieren wäre ich wohl nie gekommen. Ich glaube mir fehlt das auch noch das Auge, man-pages richtig zu lesen. Wieder etwas dazu gelernt.
*g* Noch ein Hinweis: sobald du sed verwendest brauchst du kein grep mehr. Zum Beispiel wie sich 'grep' ersetzen laesst: $ IN='abc\nbcd\ncde\ndef\nefg\nABC\nBCD\nCDE\nDEF\nEFG' $ echo -e "$IN" | grep '[eE]' | grep -v 'd' | xargs echo efg CDE DEF EFG $ echo -e "$IN" | sed -n '/[eE]/{ /d/!p; }' | xargs echo efg CDE DEF EFG $ echo -e "$IN" | awk '/[eE]/{ if($0 !~ /[d]/) { print; }; }' | xargs echo efg CDE DEF EFG Ok, "grep -i 'e'" waere auch moeglich und bei den Adressen kennt sed keinen 'i' modifier... Da muss man evtl. ueberlegen was guenstiger ist. Generell ist zu bedenken, das das starten eines Prozesses (also z.B. ein extra 'grep' (oder extrem: ein extra perl)) "teuer" ist, was jedoch sobald das ganze etwas laenger laeuft und nicht z.B. hundertfach in einer Schleife gestartet wird weniger relevant wird. In so einer Schleife sollte man aber die Prozesse minimieren. Oder die Schleife gleich in das Programm hineinverlagern, was bei 'perl' am extremsten auffaelt, da perl recht lange zum Starten braucht. Man nehme ein Verzeichnis mit einigen Dateien, hier bei mir im Beispiel sind's 1472 Dateien: $ time for f in *; do perl -e 'print "$ARGV[0]\n";' -- "$f" ; done | wc -l 1472 real 0m28.842s user 0m20.610s sys 0m8.180s $ time perl -e 'foreach(@ARGV) { print "$_\n"; }' -- * | wc -l 1472 real 0m0.054s user 0m0.040s sys 0m0.000s $ time perl -e 'foreach(@ARGV) { print "$_\n"; }' -- * | wc -l 1472 real 0m0.094s user 0m0.040s sys 0m0.010s Ein Faktor ~300-600 bei ~1500 Dateien ist nicht schlecht, oder? Ja, die letzten beiden waren direkt hintereinander gestartet... Bei so kurzen Zeiten unter 0.1s variieren die 'time' Ausgaben (gerade mit perl) oft so deutlich, ich hatte hier grad Zeiten zwischen 0.044s und 0.098s, die Zeiten der ersten Schleife hingegen variierten nur hinter dem Komma (zwischen 28.6s und 28.9s ungefaehr)... Also immer ein bisserl ein Auge darauf haben, dass man nicht unnoetig Prozesse startet. Wenn man auf der Kommandozeile fuer den "einmal Gebrauch" was zusammenbastelt, dann macht's nix, aber wenn man's in ein Script schreibt sollte man sich ueber sowas schon Gedanken machen. -dnh -- Support bacteria - it's the only culture some people have!
participants (7)
-
"Günter Haus"
-
age@ifak-system.com
-
David Haller
-
Guenter.Haus@gmx.at
-
Manfred Tremmel
-
Markus Hochmann
-
Thomas Rippler