| wichtige Werkzeuge - cut, split, csplit, fold, join |
|
|
|
|
cut, fold, split, csplit Wir wollen beginnen, Dateiinhalte zu "zersäbeln", und die Stücke dann wieder neu zusammenzusetzen. cut wird Ihnen sicher schon in der Arbeit mit Ihrem Computer untergekommen sein, wahrscheinlich mit dem deutschen Wort dafür, was "ausschneiden" ist. "Ausschneiden und Einfügen" (cut and paste), das wird sehr häufig gebraucht. Wir wollen uns also zuerst einmal den cut-Befehl mit manchen Optionen ansehen. Mit der Option -f können Sie die auszuschneidenden Felder (field) auswählen, mit -c geben Sie einen auszuschneidenden Zeichenbereich bekannt. Die Felder werden dabei als durch Beistrich getrennten Spaltenzahl angegeben. cut nimmt automatisch an, dass es sich beim Trennzeichen um einen Tabulator handelt. Wenn dem nicht so ist (und meistens ist es eben kein Tabulator), dann muss man Trennzeichen eigens mit der Option -d angeben. Übrigens, die Trennzeichen müssen dann zwischen den einzelnen Feldern im file immer gleich sein, dürfen nicht variieren! Eine Datei hat zum Beispiel vier, durch ein Leerzeichen voneinander getrennte, Spalten, und nun möchten Sie die Spalten zwei bis drei daraus ausschneiden. user@host:/tmp> cut -d " " -f2,3 2 Poeltl Michael Poeltl Maria-Lourdes Poeltl Michelle Benco Lubomir Bucko Tomas Paier Joachim user@host:/tmp> Sie sehen schon, dass cut nicht bei 0 zu zählen beginnt. Spalte 2 und Spalte 3 wurden also aus der Ausgabe des files 2 ausgeschnitte und auf die Ausgabe geschrieben. Alle anderen Spalten wurden einfach ausgeblendet. Die Ausgabe ist auch dieselbe, wenn ich die Reihenfolge bei der Angabe der Spalten umdrehe! Probieren Sie es gleich einmal selber aus. user@host:/tmp> ls -l |cut -d ' ' -f6,1 ... drwxr-xr-x users -rw-r--r-- users -rw-r--r-- users ... user@host:/tmp> Die positionsbezogene Zerlegung mit -c ist NICHT kombinierbar mit der feldbezogenen. Man gibt in dieser Angelegenheit Anfang und Ende eines Zeichenbereiches an. user@host:/tmp> cut -c 14-20 2 ael boy a-Lourd elle gi ir boy boy im boy user@host:/tmp> ls -al | cut -c 10-15,44-50 - 22006-08 - 12006-09 x 42004-04 x 52006-09 - 1200r-10 x 62005-05 ... ... user@host:/tmp> Die Beispiele sprechen fast schon für sich selber. Im zweiten Beispiel sahen Sie, dass man auch mehrere Bereiche angeben kann. Die Leerzeichen werden hier mitgezählt und mitausgegeben. foldWenn Sie einen Text haben, dessen Zeilenlängen durch das ganze Dokument hindurch sehr lang sind, so über 200 Zeichen und mehr, dann können Sie mit fold den Text so einrichten, dass die Zeilen eine maximale Zeichenlänge von 80 Zeichen haben. Die 80 Zeichen stellen auch die Voreinstellung dar. Die -b Option zählt einen Tabulator als ein Zeichen und -s führt einen Zeilenumbruch auf dem letzten möglichen in der Zeile enthaltenen Leerzeichen durch. Mittels der Option -w (von mir meist genutzt), gefolgt von einer Zahl, läßt Sie Ihren gewünschten Zeilenlängewert gesondert einstellen, also ungleich 80 Zeichen setzen. user@host:/tmp> ls -al | fold -w 20 drwxr-xr-x 5 user users 336 2004-09-17 16:03 ... ... user@host:/tmp> Was bei einem normalen ls -al eine Zeile gewesen wäre, wurde von fold auf drei Zeilen mit je maximal 20 Zeichen zusammengefaltet! fold kommt bei mir am häufigsten zum Einsatz, wenn ich selbst getippselte ASCII-Texte zum Drucker schicke und sicherstellen will, dass ja alles auf den A4-Blättern oben ist und die Ausgabe am rechten Rand nicht abgeschnitten wurde. user@host:/tmp> fold -w 75 /work/skriptum_NL/SONSTIGES.txt |lpr -P duplex user@host:/tmp> und jetzt sollten die Zeilen garantiert nicht vom Drucker abgeschnitten worden sein, weil diese nicht mehr aus dem Druckbereich hinausragen. splitMit cat können Sie mehrere Dateien zu einer zusammenfügen, und die Reihenfolge der Zusammensetzung durch die Reihenfolge der Angabe steuern - Datei2 wird unterhalb von Datei1 angehängt, oder umgekehrt. cat datei1 datei2 datei3 >/tmp/datei4, Sie erinnern sich? Split macht das Gegenteil, nämlich zeilenweise bzw. byteweise Trennungen von Dateien durchzuführen. Ohne jegliche Angabe von Optionen trennt split die Datei nach JEDER 1000. Zeile! Die Splitterdateien werden von split automatisch mit von ihm erzeugten Dateinamen versehen, die mit x beginnen, gefolgt von aa, ab, ac ....zz. user@host:/tmp> rm 1 2 3; mkdir split; cd split user@host:/tmp/split> cat /etc/services >splitversuch user@host:/tmp/split> split splitversuch user@host:/tmp/split> ls splitversuch xaa xab xac xad xae xaf xag xah xai user@host:/tmp/split> wc -l xaa 1000 xaa user@host:/tmp/split> rm x* user@host:/tmp/split> Unser erster gemeinsamer Ausflug in die Welt von split hat uns gezeigt, das bislang einmal alles stimmte, was da geschrieben stand. Mit der Option -b kann ich die Zerlegung byteweise steuern, was vor allem bei binären Dateien (oder mp3-Liedern) Sinn macht. Zusätzliche Angaben von b,k oder m fixierten die Zerlegung auf eine gewisse Einheit.
Oder, Sie geben größere Werte gleich mit dem Wert gefolgt von "k" oder "m" an. split -b 50m home.tgz homesplit Im folgenden Beispiel nehmen wir an, dass Sie ein mp3-file namens always.mp3 (ein Song von Leonard Coen) sich vom Rechner eines Freundes kopieren wollen. Der Freund hat kein Internet und keinen CD/DVD-Brenner, und Sie haben keinen Memory-Stick bzw. keine USB-Festplatte. Das einzige was Sie haben sind Disketten, natürlich viel zu klein, um alles unterzubringen ... und jetzt kommt split ins Spiel ... freund@freundhost:~/music> du -sh always.mp3 7.4M always.mp3 freund@freundhost:~/music> mkdir for_split freund@freundhost:~/music> cp always.mp3 ./for_split freund@freundhost:~/music> cd for_split freund@freundhost:~/music/for_split> split -b 1m always.mp3 always freund@freundhost:~/music/for_split> ls always.mp3 alwaysaa alwaysab alwaysac alwaysad alwaysae Mit dem du-Befehl (dis usage) konnten wir uns ausgeben lassen, wie gross das file ist. user@host:~> cat file1 file2 file3 > file4 user@host:~> file1, file2 und file3 wurden in genau dieser Reihenfolge zu file4 vereint! Das gleiche Prinzip wenden wir nun bei unserem zerstückelten mp3-file an! user@host:~/mp3> ls alwaysaa alwaysab alwaysac alwaysad alwaysae alwaysaf alwaysag alwaysah user@host:~/mp3> cat alwaysaa alwaysab alwaysac alwaysad alwaysae alwaysaf alwaysag alwaysah > always.mp3 user@host:~/mp3> ls always.mp3 alwaysaa alwaysab alwaysac alwaysad alwaysae alwaysaf alwaysag alwaysah user@host:~/mp3> Es funktioniert! Spätestens dann, wenn Sie versuchen, dieses mp3-file abzuspielen, werden Sie merken, dass es unverändert abgespielt wurde! csplitist sehr ähnlich zu split, macht aber nur bei Textdateien Sinn, weil die Zerlegung durch einen regulären Ausdruck gesteuert wird. Jene Zeile, in der das Suchmuster gefunden wurde, wird zur ersten Zeile der ersten Splitterdatei. user@host:/tmp> mkdir csplittest; cd csplittest; cat <<"EOF" >test5 > aaa > bbbbbb > cccdd > aaa > ddddd > xxxx > EOF user@host:/tmp/csplittest> csplit test5 /ddd/ 21 11 user@host:/tmp/csplittest> ls test5 xx00 xx01 user@host:/tmp/csplittest> cat xx00 aaa bbbbbb cccdd aaa user@host:/tmp/csplittest> cat xx01 ddddd xxxx user@host:/tmp/csplittest> cd ..; rm -rf csplittest user@host:/tmp> joinMit join kann man zwei Dateien in Abhängigkeit von der Angabe eines Schlüsselfeldes zusammenfügen, und dabei könnte man sogar die Reihenfolge komplett ändern! Wichtig ist nur, dass das Schlüsselfeld von file1 ident ist mit dem Schlüsselfeld von file2! join -1 3 -2 2 -o 1.1 2.1 1.3 2.4 1.4 file1 file2 -1 und -2 stehen für file1 und file2. die Zahl 3 neben -1 meint, dass die "Schlüsselspalte, die ident sein soll zur Spalte 2 in Datei 2 (-2 2) die 3. Spalte von file1 ist. Nach der Option -o wird gefordert:\\ Zuerst Spalte 1 von file1, danach Spalte 1 von file2, danach Spalte 3 von file1, danach Spalte 4 von file2, und danach Spalte 4 von file1. file1 heißt deswegen file1, weil es ls erste Datei genannt wird, file2, weil es als zweite genannt wurde. Die neu geschaffene Ausgabe lässt sich wieder in ein file umlenken (z.B. in file3). Wenn man ls -al in eine Datei umleitet, und diese Datei zwei Mal bei join als Argumenten angibt, dann könnte man ebenfalls gezielt die Ausgabereihenfolge der einzelnen Spalten verändern. user@host:/tmp> ls -al > jointest user@host:/tmp> join -1 1 -2 1 -o 1.5 1.2 1.3 jointest jointest; rm jointest 13 1024 2 user 9216 29 root 32 1 user 32 1 user 32 1 user 21 1 user 21 1 user 21 1 user 11 1 user 11 1 user 11 1 user user@host:/tmp> |
||||||||||
| Letzte Aktualisierung ( Friday, 1. June 2007 ) | ||||||||||
| Weiter > |
|---|



