Menu Content/Inhalt
Home arrow Systemadministration arrow wichtige Werkzeuge - cut, split, csplit, fold, join
wichtige Werkzeuge - cut, split, csplit, fold, join PDF Drucken E-Mail

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.

fold

Wenn 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.

split

Mit 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.
Sie können aber das x durch eine eigene Angabe nach dem ersten Argument des split-Befehls selber angeben.

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.

-bb-512-Byte-Blöcke
-bk-1024 Byte
-bm-1024 kByte

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  
alwaysaf alwaysag alwaysah freund@freundhost:~/music/for_split> du -sh alwaysad 1.1M alwaysad freund@freundhost:~/music/for_split> du -sh alwaysae 1.1M alwaysae freund@freundhost:~/music/for_split>

Mit dem du-Befehl (dis usage) konnten wir uns ausgeben lassen, wie gross das file ist.
Jetzt haben wir also das mp3-file in kleinere Stücke zerlegt, und können jedes einzelne auf eine Diskette spielen und so mit nach hause nehmen. Daheim spielt man sich die einzelnen Teile dann wieder in einen Ordner und fügt sie zu einem "always.mp3"-mp3-file zusammen. Wie? Nun, das haben wir schon kennengelernt, nur nicht in dieser Form! Erinnern Sie sich an den cat-Befehl und was der alles kann? Zum Beispiel kann cat folgendes:

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!

csplit

ist 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>

join

Mit 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!
Mit der Option -o können Sie dann die neue Anordnung der einzelnen Felder von file1 und file2 angeben.

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 >

Scroll-news

Mailingliste:
http://mlists.in-berlin.de/mailman/listinfo/lieo-mlists.in-berlin.de 

 

Das Forum ist online gegangen

 


Who's Online

Aktuell 137 Gäste online

Google AdSense