Příkaz cut se používá v systémech Linux a Unix k vyříznutí částí a částí z každého řádku souboru a zapsání výsledku na standardní výstup. Lze jej použít k vyříznutí částí řádku podle pozice bajtu, znaku a pole (oddělovač).
V tomto tutoriálu se naučíme linuxový příkaz cut s několika praktickými příklady, které můžete použít ve svých každodenních činnostech na příkazovém řádku.
Příkaz a syntaxe Cut
Základní syntaxe příkazu cut je následující:
cut OPTION... [FILE]...
Pojďme zkontrolovat možnosti vyjmutí a bez jakékoli možnosti nebude příkaz cut fungovat.
Možnosti vyjmutí
-f
:Extrahujte zadáním pole. Příkaz Vyjmout používá jako výchozí oddělovač pole 'TAB'.
-d
:Výchozí oddělovač je 'Tab' a pomocí této možnosti můžete použít konkrétní oddělovač.
-b
:Pro extrakci zadáním bajtu. Lze také zadat rozsah bajtů.
-c
:Oříznutí podle znaků. Může to být seznam čísel oddělených čárkou nebo rozsah čísel oddělených pomlčkou (-).
–complement
:Toto doplní výběr
–output-delimiter
:Chcete-li změnit výstupní oddělovač, použijte volbu -output-delimiter='oddělovač'.
--only-delimited
:Vyjmout nevytiskne řádky neobsahující oddělovače
Pro ilustraci našich příkladů budeme v tomto tutoriálu používat následující textový soubor s názvem 'content.txt' a soubor /etc/passwd.
$ cat content.txt
Ubuntu Linux
Microsoft Windows
OsX El Capitan
Unix
FreeBSD
Jak oříznout pomocí oddělovače
Nejčastěji používanou možností řezu je kombinace -d
a -f
. V podstatě bude extrahovat obsah na základě konkrétního oddělovače a uvedených polí.
Například následující vytiskne pouze 1. pole každého řádku ze souboru '/etc/passwd' pomocí oddělovače (:).
$ cut -d':' -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
...
Následující příklad, kde jako oddělovač použijeme mezeru (" ") a vyjmeme 1. pole ze souboru s názvem 'content.txt'.
$ cut -d " " -f 1 content.txt
Ubuntu
Microsoft
OsX
Unix
FreeBSD
Tento příklad extrahuje více než jedno pole z určitého souboru. Zde extrahujeme 1. a 6. pole pomocí oddělovače dvojtečka (:) ze souboru '/etc/passwd', který má řetězec '/bin/bash':
$ grep "/bin/bash" /etc/passwd | cut -d':' -f1,6
root:/root
slax:/home/slax
Chcete-li zobrazit rozsah polí, zadejte počáteční pole a koncové pole oddělené spojovníkem (-), jak je znázorněno níže:
$ grep "/bin/bash" /etc/passwd | cut -d':' -f1-4,6,7
root:x:0:0:/root:/bin/bash
slax:x:1000:1000:/home/slax:/bin/bash
Jak doplnit výběr výstupu
K doplnění seznamu polí výběru použijte --complement
volba. Tato možnost používala tam, kde vybrat všechna pole kromě zadaných polí.
V následujícím příkladu příkaz vytiskne všechna pole kromě 2. pole v souboru from '/etc/passwd':
$ grep "/bin/bash" /etc/passwd | cut -d':' --complement -f2
root:0:0:root:/root:/bin/bash
Jak určit výstupní oddělovač
Chcete-li zadat oddělovač výstupu, použijte --output-delimiter
volba. Oddělovač vstupu je určen pomocí -d
a výchozí oddělovač výstupu je stejný jako oddělovač vstupu.
Nejprve zkontrolujte výstup bez použití výstupního oddělovače takto:
$ cut -d: -f1,7 /etc/passwd | sort | uniq -u
_apt:/usr/sbin/nologin
backup:/usr/sbin/nologin
bin:/usr/sbin/nologin
daemon:/usr/sbin/nologin
dnsmasq:/usr/sbin/nologin
games:/usr/sbin/nologin
gnats:/usr/sbin/nologin
irc:/usr/sbin/nologin
landscape:/usr/sbin/nologin
list:/usr/sbin/nologin
lp:/usr/sbin/nologin
lxd:/bin/false
Nyní jsem přidal --output-delimiter
možnost a oddělovač vstupu dvojtečka (:) je nahrazena výstupním oddělovačem „SPACE“ takto:
$ cut -d: -f1,7 --output-delimiter ' ' /etc/passwd | sort | uniq -u
_apt /usr/sbin/nologin
backup /usr/sbin/nologin
bin /usr/sbin/nologin
daemon /usr/sbin/nologin
dnsmasq /usr/sbin/nologin
games /usr/sbin/nologin
gnats /usr/sbin/nologin
irc /usr/sbin/nologin
landscape /usr/sbin/nologin
list /usr/sbin/nologin
lp /usr/sbin/nologin
lxd /bin/false
Podívejme se na další příklad, zde používáme výstupní oddělovač pro tisk na každé pole na novém řádku.
Zde používáme --output-delimiter
jako $’\n’
což označuje nový řádek.
Zkontrolujte výstup:
$ grep root /etc/passwd | cut -d':' -f1,6,7 --output-delimiter=
Jak krájet podle znaků
-c
(sloupec) se používá pro ořez podle pozice znaku. Pamatujte, že „TABS“ a „Mezery“ jsou také považovány za znaky.
Chcete-li vytisknout 1. znak z každého řádku ze souboru s názvem content.txt, použijte níže:
$ cut -c 1 content.txt
U
M
O
U
F
V následujícím příkladu zobrazíme znak 1 až 7 (rozsah) každého řádku ze souboru:
$ cut -c 1-7 content.txt
Ubuntu
Microso
OsX El
Unix
FreeBSD
Podívejme se, jak vybrat sloupce podle konkrétní počáteční nebo koncové pozice.
Chcete-li extrahovat sloupce od 2. znaku po poslední znak:
$ cut -c2- content.txt
buntu Linux
icrosoft Windows
sX El Capitan
nix
reeBSD
Chcete-li extrahovat sloupce od 1. do 4. znaku:
cut -c-4 content.txt
Ubun
Micr
OsX
Unix
Free
Jak krájet po bytech
Použijte -b
možnost vybrat část řádku zadáním pozice bajtu čísly oddělenými čárkou (,). Pomocí pomlčky můžete určit rozsah bajtů.
Následující příklad vystřižený z 1., 2. a 3. bajtu ze souboru s názvem 'content.txt':
$ cut -b 1,2,3 content.txt
Ubu
Mic
OsX
Uni
Fre
Můžeme také zobrazit seznam s rozsahy pomocí níže uvedeného příkazu:
$ cut -b 1-3,5-7 content.txt
Ubutu
Micoso
OsXEl
Uni
FreBSD
Některé praktické příklady střihů
Cut se nejpraktičtěji používá s kombinací různých příkazů Linuxu nebo Unixu.
Chcete například extrahovat „USER“, „PID“ a „COMMAND“ pomocí příkazu ps:
ps -L u n | tr -s " " | cut -d " " -f 2,3,14-
USER PID COMMAND
0 676 /sbin/agetty -o -p -- \u --keep-baud 115200,38400,9600 ttyS0 vt220
0 681 /sbin/agetty -o -p -- \u --noclear tty1 linux
0 23174 -bash
0 26737 ps -L u n
0 26738 tr -s
0 26739 cut -d -f 2,3,14-
Vezměme si další příklad pro extrahování „celkové“, „použité“ a „volné“ hodnoty paměti a uložení do textového souboru pomocí více příkazů:
$ free -m | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2-4 >> memory.txt
Output
$ cat memory.txt
985 86 234
Závěr
Příkaz cut lze spojit s mnoha dalšími příkazy Linuxu nebo Unixu. Může být propojen s jedním nebo více filtry pro dodatečné zpracování textu.
Jedním z omezení příkazu vyjmout je, že nepodporuje zadání více než jednoho znaku jako oddělovače. Vícenásobné polotovary se počítají jako vícenásobné oddělovače polí a pro získání požadovaného výstupu je nutné před řezáním použít příkaz tr.
\n' root /root /bin/bash operator /root /sbin/nologin
Jak krájet podle znaků
-c
(sloupec) se používá pro ořez podle pozice znaku. Pamatujte, že „TABS“ a „Mezery“ jsou také považovány za znaky.
Chcete-li vytisknout 1. znak z každého řádku ze souboru s názvem content.txt, použijte níže:
V následujícím příkladu zobrazíme znak 1 až 7 (rozsah) každého řádku ze souboru:
Podívejme se, jak vybrat sloupce podle konkrétní počáteční nebo koncové pozice.
Chcete-li extrahovat sloupce od 2. znaku po poslední znak:
Chcete-li extrahovat sloupce od 1. do 4. znaku:
Jak krájet po bytech
Použijte -b
možnost vybrat část řádku zadáním pozice bajtu čísly oddělenými čárkou (,). Pomocí pomlčky můžete určit rozsah bajtů.
Následující příklad vystřižený z 1., 2. a 3. bajtu ze souboru s názvem 'content.txt':
Můžeme také zobrazit seznam s rozsahy pomocí níže uvedeného příkazu:
Některé praktické příklady střihů
Cut se nejpraktičtěji používá s kombinací různých příkazů Linuxu nebo Unixu.
Chcete například extrahovat „USER“, „PID“ a „COMMAND“ pomocí příkazu ps:
Vezměme si další příklad pro extrahování „celkové“, „použité“ a „volné“ hodnoty paměti a uložení do textového souboru pomocí více příkazů:
Závěr
Příkaz cut lze spojit s mnoha dalšími příkazy Linuxu nebo Unixu. Může být propojen s jedním nebo více filtry pro další zpracování textu.
Jedním z omezení příkazu vyjmout je, že nepodporuje zadání více než jednoho znaku jako oddělovače. Vícenásobné polotovary se počítají jako vícenásobné oddělovače polí a pro získání požadovaného výstupu je nutné před řezáním použít příkaz tr.