[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal:Ein Terminal öffnen] }}} [[Inhaltsverzeichnis(1)]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] Der Befehl '''cut''' extrahiert spaltenweise Ausschnitte aus Textzeilen. So können bspw. aus einer [:Logdateien:Logdatei] irrelevante Informationen entfernt oder [wikipedia:CSV_(Dateiformat):CSV-Dateien] bearbeitet werden. = Installation = Das Programm ist im Paket * '''coreutils''' von Ubuntu enthalten und deshalb auf jedem System vorinstalliert. = Aufruf = Die allgemeine Syntax lautet [1]: {{{#!vorlage Befehl cut OPTION DATEI }}} `cut` kennt folgende Optionen: {{{#!vorlage Tabelle Optionen von `cut` +++ Option Beschreibung +++ `-b` oder `--bytes` Angabe der Bytepositionen +++ `-c` oder `--characters` Angabe der Zeichenpositionen (entspricht derzeit `-b`) +++ `-d` oder `--delimiter` Angabe des Trennzeichens (Delimiter) anstelle des Tabulators (Standard) +++ `-f` oder `--fields` Angabe der zu extrahierenden Felder +++ `-s` oder `--only-delimited` Keine Ausgabe von Zeilen ohne Trennzeichen (Delimiter) }}} `b`, `c` oder `f` können nicht gemeinsam verwendet werden. Weitere Optionen sind der [:man:Manpage] zu entnehmen. = Beispiele = In der Datei '''/etc/passwd''' stehen die Benutzernamen in der ersten Spalte. Diese Datei enthält jedoch auch weitere Informationen: {{{ root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh … }}} Der folgende Befehl führt dazu, dass nur die Benutzernamen ausgegeben werden: {{{#!vorlage Befehl cut -d: -f1 /etc/passwd }}} {{{ root daemon bin … }}} `-d:` beschreibt dabei das Zeichen, das die Felder trennt. Im Beispiel ist das der Doppelpunkt. `-f1` zeigt an, dass nur das erste Feld ausgegeben werden soll, in diesem Fall der Benutzername. Auch mehrere, getrennte Felder können angezeigt werden: {{{#!vorlage Befehl cut -d: -f1,7 /etc/passwd }}} {{{ root:/bin/bash daemon:/bin/sh bin:/bin/sh … }}} Der folgende Befehl zeigt mehrere Spalten einer Ausgabe an, deren Felder durch Leerzeichen getrennt sind. Konkret werden dabei Betriebssystem und Kernelversion aus der Ausgabe des Befehls `uname -a` extrahiert: {{{#!vorlage Befehl uname -a }}} {{{ Linux nutzer-laptop 3.2.0-030200-generic #201201042035 SMP Thu Jan 5 01:36:31 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux }}} {{{#!vorlage Befehl uname -a | cut -d" " -f1,3,12 }}} {{{ Linux 3.2.0-030200-generic x86_64 }}} Beim folgenden Beispiel sind die einzelnen Spalten nicht durch Tabulatoren, sondern durch mehrere Leerzeichen getrennt. Die aufeinander folgenden Leerzeichen werden durch das Programm [:tr:] in ein einzelnes umgewandelt. Konkret wird die prozentuale Belegung des Homeverzeichnis aus der Ausgabe des Befehls [:df:] extrahiert. Sieht die Ausgabe von {{{#!vorlage Befehl df /home }}} z.B. so aus: {{{ Dateisystem 1K-Blöcke Benutzt Verfügbar Verw% Eingehängt auf /dev/sdc1 1922728752 653507768 1171528928 36% /home }}} dann liefert die Befehlsfolge {{{#!vorlage Befehl df /home | grep home| tr -s ' '| cut -d ' ' -f 5 }}} als Ausgabe: {{{ 36% }}} Absolute Positionsangaben können ebenfalls verwendet werden. Im folgenden Beispiel werden aus der Liste aller laufenden Prozesse die [wikipedia:Process_identifier:PIDs] augeschnitten. Diese stehen in den Spalten 9 bis 14: {{{#!vorlage Befehl ps huax | cut -c 9-14 }}} Positionsangaben müssen nicht durch vorbestimmte Endpunkte bestimmt sein: {{{#!vorlage Befehl echo "123456789" | cut -c 5- }}} {{{ 56789 }}} Durch eine Kombination von Befehlen kann `cut` auf jedes Zeichen einer Datei zugreifen. Mit dem folgenden Befehl wird das dritte Wort der 6. Zeile der Datei '''datei.txt''' extrahiert. Es werden dabei zunächst mit `head` die ersten 6 Zeilen ausgeschnitten, dann mit `tail` die letzte dieser verbleibenden Zeilen und schließlich mit `cut` deren drittes Wort: {{{#!vorlage Befehl cat datei.txt | head -6l | tail -1l | cut -d" " -f3 }}} = Bekannte Probleme = Bei den Optionen `-b` und `-c` gibt es Probleme im Zusammenspiel mit Sonderzeichen wegen fehlender Unterstützung für UTF-8 und andere Multi-Byte bzw. Unicode-Varianten in coreutils. {{{#!vorlage Befehl echo "problem" | cut -c4-7 }}} {{{ blem }}} {{{#!vorlage Befehl echo "pröbläm" | cut -c4-7 }}} {{{ �bl� }}} = Problembehebung = `Cut` stößt an seine Grenzen, wenn mehr als ein Zeichen als Trenner zu verarbeiten ist. Ist es das gleiche Zeichen, nur doppelt, ergibt sich eine ungewöhnliche Zählweise der Felder (1, 3, 5, …), weil das Feld zwischen dem ersten und zweiten Trennzeichen extra gezählt wird. {{{#!vorlage Befehl apt-config dump | grep Size }}} {{{ APT::Archives::MaxSize "500"; }}} {{{#!vorlage Befehl apt-config dump | grep Size | cut -d':' -f[mark]3[/mark] }}} {{{ Archives }}} Die Kombination von zwei unterschiedlichen Zeichen als Trenner ist mit mehrmaligen Anwenden von `cut` zu lösen. In dem Fall kann alternativ auch der Einsatz von [:awk:] in Betracht gezogen werden. = Links = * [:choose:] - Alternative zu cut * [https://www.gnu.org/software/coreutils/coreutils.html GNU Core Utilities] {en} * [wikipedia:Cut_(Unix):cut] * [http://www.linux-praxis.de/linux1/befehle3.html Unix-Texttools] {de} – Online-Anleitung * [:Shell/Befehlsübersicht:] {Übersicht} Übersicht über verschiedene Shell-Befehle * [https://crashcourse.housegordon.org/coreutils-multibyte-support.html GNU Coreutils Multibyte Support] {en} # tag: Shell