cut

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. ⚓︎ Ein Terminal öffnen

Inhaltsverzeichnis
  1. Installation
  2. Aufruf
  3. Beispiele
  4. Bekannte Probleme
  5. Problembehebung
  6. Links

Wiki/Icons/terminal.png Der Befehl cut extrahiert spaltenweise Ausschnitte aus Textzeilen. So können bspw. aus einer Logdatei irrelevante Informationen entfernt oder CSV-Dateien bearbeitet werden.

Installation

Das Programm ist im Paket

von Ubuntu enthalten und deshalb auf jedem System vorinstalliert.

Aufruf

Die allgemeine Syntax lautet [1]:

cut OPTION DATEI 

cut kennt folgende Optionen:

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

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:

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:

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

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

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 PIDs augeschnitten. Diese stehen in den Spalten 9 bis 14:

ps huax | cut -c 9-14 

Positionsangaben müssen nicht durch vorbestimmte Endpunkte bestimmt sein:

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:

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.

echo "problem" | cut -c4-7 

blem

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.

apt-config dump | grep Size  

APT::Archives::MaxSize "500";

apt-config dump | grep Size | cut -d':' -f3 

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.