![Een terminaldisplay op een opengeklapt laptopscherm](https://www.howtogeek.com/wp-content/uploads/2021/11/shutterstock_1278851809.png?width=1198&trim=1,1&bg-color=000&pad=1,1)
de Linux cut
Met de opdracht kunt u delen van tekst extraheren uit bestanden of gegevensstromen. Het is vooral handig voor het werken met gegevens met scheidingstekens, zoals CSV-bestanden. Dit is wat u moet weten.
Het knippen Commando
De cut
command is een veteraan van de Unix-wereld en debuteerde in 1982 als onderdeel van AT&T System III UNIX. Het doel in het leven is om delen van tekst uit bestanden of streams te knippen, volgens de criteria die u instelt. De syntaxis is even eenvoudig als het doel, maar het is deze gezamenlijke eenvoud die het zo nuttig maakt.
Op de aloude UNIX-manier, door te combineren cut
met andere hulpprogramma’s zoals: grep
je kunt elegante en krachtige oplossingen bedenken voor uitdagende problemen. Hoewel er verschillende versies van zijn cut
, gaan we de standaard GNU/Linux-versie bespreken. Houd er rekening mee dat andere versies, met name de cut
gevonden in BSD-varianten, bevatten niet alle opties die hier worden beschreven.
U kunt controleren welke versie op uw computer is geïnstalleerd door deze opdracht uit te voeren:
cut --version
Als u “GNU coreutils” in de uitvoer ziet, bevindt u zich in de versie die we in dit artikel gaan beschrijven. Alle versies van cut
hebben een deel van deze functionaliteit, maar aan de Linux-versie zijn verbeteringen toegevoegd.
Eerste stappen met knippen
Of we nu informatie doorsluizen naar cut
of met behulp van cut
om een bestand te lezen, zijn de commando’s die we gebruiken hetzelfde. Alles wat u kunt doen met een stroom invoer met cut
kan worden gedaan op een regel tekst uit een bestand, en vice versa. We kunnen het zeggen cut
om met bytes, tekens of gescheiden velden te werken.
Om een enkele byte te selecteren, gebruiken we de -b
(byte) optie en tell cut
welke byte of bytes we willen. In dit geval is het byte vijf. We sturen de string “how-to geek” naar de cut
commando met een pipe, “|”, from echo
.
echo 'how-to geek' | cut -b 5
De vijfde byte in die string is “t”, dus cut
reageert door “t” in het terminalvenster af te drukken.
Om een te specificeren bereik we gebruiken een koppelteken. Om bytes 5 tot en met 11 te extraheren, geven we deze opdracht:
echo 'how-to geek' | cut -b 5-11
U kunt meerdere enkele bytes of reeksen opgeven door ze te scheiden met komma’s. Gebruik deze opdracht om byte 5 en byte 11 uit te pakken:
echo 'how-to geek' | cut -b 5,11
Om de eerste letter van elk woord te krijgen, kunnen we dit commando gebruiken:
echo 'how-to geek' | cut -b 1,5,8
Als u het koppelteken gebruikt zonder a eerst nummer, cut
geeft alles terug van positie 1 tot en met het nummer. Als u het koppelteken gebruikt zonder a seconde nummer, cut
retourneert alles van het eerste nummer tot het einde van de stream of regel.
echo 'how-to geek' | cut -b -6
echo 'how-to geek' | cut -b 8-
Knippen met tekens gebruiken
Gebruik makend van cut
met tekens is vrijwel hetzelfde als het gebruiken met bytes. In beide gevallen moet speciale aandacht worden besteed aan complexe karakters. Door gebruik te maken van de -c
(karakter) optie, vertellen we cut
om te werken in termen van tekens, niet in bytes.
echo 'how-to geek' | cut -c 1,5,8
echo 'how-to geek' | cut -c 8-11
Deze werken precies zoals je zou verwachten. Maar kijk eens naar dit voorbeeld. Het is een woord van zes letters, dus vragen cut
om de tekens van één tot zes terug te geven, moet het hele woord worden geretourneerd. Maar dat doet het niet. Het is een teken te kort. Om het hele woord te zien, moeten we de tekens van één tot zeven vragen.
echo 'piñata' | cut -c 1-6
echo 'piñata' | cut -c 1-7
Het probleem is dat het teken “ñ” eigenlijk uit twee bytes bestaat. We kunnen dit vrij gemakkelijk zien. We hebben een kort tekstbestand met deze regel tekst:
cat unicode.txt
We zullen dat bestand onderzoeken met de hexdump
nutsvoorziening. De … gebruiken -C
(canonieke) optie geeft ons een tabel met hexadecimale cijfers met het ASCII-equivalent aan de rechterkant. In de ASCII-tabel wordt de “ñ” niet weergegeven, in plaats daarvan zijn er punten die staan voor twee niet-afdrukbare tekens. Dit zijn de bytes die zijn gemarkeerd in de hexadecimale tabel.
hexdump -C unicode.txt
Deze twee bytes worden gebruikt door het weergaveprogramma – in dit geval de Bash-shell – om de “ñ” te identificeren. Veel Unicode-tekens gebruiken drie of meer bytes om één teken weer te geven.
Als we om teken 3 of teken 4 vragen, krijgen we het symbool voor een niet-afdrukbaar teken te zien. Als we om bytes 3 . vragen en 4, interpreteert de shell ze als “ñ.”
echo 'piñata' | cut -c 3
echo 'piñata' | cut -c 4
echo 'piñata' | cut -c 3-4
Knippen met gescheiden gegevens gebruiken
We kunnen het vragen cut
om regels tekst te splitsen met een gespecificeerd scheidingsteken. Knippen gebruikt standaard een tab-teken, maar het is gemakkelijk om te zeggen dat het moet gebruiken wat we willen. De velden in het bestand “/etc/passwd” worden gescheiden door dubbele punten “:”, dus we gebruiken dat als scheidingsteken en extraheren wat tekst.
De tekstgedeelten tussen de scheidingstekens heten veldenen waarnaar wordt verwezen net als bytes of tekens, maar ze worden voorafgegaan door de -f
(velden) optie. U kunt een spatie tussen de “f” en het cijfer laten, of niet.
Het eerste commando gebruikt de -d
(scheidingsteken) optie om te vertellen dat knippen “:” als scheidingsteken moet gebruiken. Het gaat het eerste veld uit elke regel in het bestand “/etc/passwd” halen. Dat wordt een lange lijst, dus we gebruiken head
met de -n
(nummer) optie om alleen de eerste vijf antwoorden te tonen. Het tweede commando doet hetzelfde, maar gebruikt tail
om ons de laatste vijf reacties te laten zien.
cut -d':' -f1 /etc/passwd | head -n 5
cut -d':' -f2 /etc/passwd | tail -n 5
Om een selectie van velden te extraheren, vermeldt u ze als een door komma’s gescheiden lijst. Met deze opdracht worden de velden één tot drie, vijf en zes geëxtraheerd.
cut -d':' -f1-3,5,6 /etc/passwd | tail -n 5
Door op te nemen grep
in de opdracht kunnen we zoeken naar regels die “/bin/bash” bevatten. Het betekent dat we alleen die items kunnen weergeven die Bash als hun standaardshell hebben. Dat zijn meestal de “normale” gebruikersaccounts. We vragen om velden van één tot zes omdat het zevende veld het standaard shell-veld is en we weten al wat dat is – we zijn ernaar aan het zoeken.
grep "/bin/bash" /etc/passwd | cut -d':' -f1-6
Een andere manier om alle velden behalve één op te nemen, is door de --complement
optie. Dit keert de veldselectie om en toont alles dat heeft niet aangevraagd. Laten we het laatste commando herhalen, maar alleen om veld zeven vragen. Dan voeren we die opdracht opnieuw uit met de --complement
optie.
grep "/bin/bash" /etc/passwd | cut -d':' -f7
grep "/bin/bash" /etc/passwd | cut -d':' -f7 --complement
Het eerste commando vindt een lijst met items, maar veld zeven geeft ons niets om ze van elkaar te onderscheiden, dus we weten niet naar wie de items verwijzen. In het tweede commando, door de toe te voegen --complement
optie krijgen we alles behalve veld zeven.
Leidingen gesneden in snit
Laten we bij het bestand “/etc/passwd” blijven en veld vijf extraheren. Dit is de werkelijke naam van de gebruiker die eigenaar is van het gebruikersaccount.
grep "/bin/bash" /etc/passwd | cut -d':' -f5
Het vijfde veld heeft subvelden gescheiden door komma’s. Ze zijn zelden bevolkt, dus verschijnen ze als een regel komma’s.
We kunnen de komma’s verwijderen door de uitvoer van het vorige commando in een andere aanroep van te pipen cut
. Het tweede exemplaar van cut
gebruikt de komma “,” als scheidingsteken. De -s
(alleen gescheiden) optie vertelt cut
om resultaten te onderdrukken die helemaal geen scheidingsteken bevatten.
grep "/bin/bash" /etc/passwd | cut -d':' -s -f5 | cut -d',' -s -f1
Omdat het root-item geen komma-subvelden heeft in het vijfde veld, wordt het onderdrukt en krijgen we de resultaten die we zoeken: een lijst met de namen van de “echte” gebruikers die op deze computer zijn geconfigureerd.
Het outputscheidingsteken
We hebben een klein bestand met enkele door komma’s gescheiden waarden erin. De velden in deze dummy-gegevens zijn:
- ID kaart: Een database-ID-nummer
- Eerst: De voornaam van het onderwerp.
- Laatst: De achternaam van het onderwerp.
- e-mail: Hun e-mailadres.
- IP adres: Hun IP-adres.
- Merk: Het merk motorvoertuig waarmee ze rijden.
- Model: Het model motorvoertuig waarmee ze rijden.
- Jaar: Het jaar waarin hun motorvoertuig werd gebouwd.
cat small.csv
Als we cut vertellen om de komma als scheidingsteken te gebruiken, kunnen we velden extraheren zoals we eerder deden. Soms moet u gegevens uit een bestand extraheren, maar wilt u niet dat het veldscheidingsteken in de resultaten wordt opgenomen. De … gebruiken --output-delimiter
we kunnen zien welk personage – of eigenlijk personage – reeks-te gebruiken in plaats van het eigenlijke scheidingsteken.
cut -d ',' -f 2,3 small.csv
cut -d ',' -f 2,3 small.csv --output-delimiter=" "
Het tweede commando vertelt cut
om de komma’s te vervangen door spaties.
We kunnen verder gaan en deze functie gebruiken om de uitvoer naar een verticale lijst te converteren. Deze opdracht gebruikt een nieuw regelteken als uitvoerscheidingsteken. Let op de “$” die we moeten opnemen om het newline-teken te laten reageren, en niet te interpreteren als een letterlijke reeks van twee tekens.
We gebruiken grep
om de invoer voor Morgana Renwick eruit te filteren en vraag: cut
om alle velden van veld twee tot het einde van het record af te drukken, en om een teken voor een nieuwe regel als uitvoerscheidingsteken te gebruiken.
grep 'renwick' small.csv | cut -d ',' -f2- --output-delimiter=$''
Een Oldie maar Goldie
Op het moment van schrijven nadert het kleine snij-commando zijn 40e verjaardag, en we gebruiken het nog steeds en schrijven er vandaag over. Ik veronderstel dat het opknippen van tekst vandaag hetzelfde is als 40 jaar geleden. Dat wil zeggen, een stuk makkelijker als je het juiste gereedschap bij de hand hebt.