Hoe de Linux-cut-opdracht te gebruiken?

Een terminaldisplay op een opengeklapt laptopscherm
fatmawati achmad zaenuri/Shutterstock.com

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.

Wat is het verschil tussen Linux en BSD?

VERWANTWat is het verschil tussen Linux en BSD?

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

Een enkele byte extraheren met cut

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

Een reeks bytes extraheren met cut

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

Twee bytes extraheren met cut

Om de eerste letter van elk woord te krijgen, kunnen we dit commando gebruiken:

echo 'how-to geek' | cut -b 1,5,8

Drie bytes extraheren met cut

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-

Bereiken van bytes extraheren met cut

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

Tekens en reeksen tekens extraheren met knippen

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

Speciale tekens kunnen meer dan één teken bevatten

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

De inhoud van het korte tekstbestand

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

Hexdump van het testtekstbestand

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 gebruiken om de tekens te extraheren waaruit een speciaal teken bestaat

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

Een reeks velden extraheren uit het bestand /etc/passwd

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

Een reeks velden extraheren uit het bestand /etc/passwd

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

Velden één tot zes extraheren uit het /etc/passwd-bestand

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

De optie --complement gebruiken om een ​​veldselectie om te keren

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 van het /etc/passwd-bestand kan door komma's gescheiden subvelden hebben

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

Leidingen in snit gesneden om met twee soorten scheidingsteken om te gaan

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

Een tekstbestand met dummy CSV-gegevens

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

De --output-delimiter gebruiken om het scheidingsteken in de resultaten te wijzigen

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 record naar een lijst converteren door een nieuwregelteken als uitvoerscheidingsteken te gebruiken

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.

Nieuwste artikelen

spot_img

Related Stories

Leave A Reply

Vul alstublieft uw commentaar in!
Vul hier uw naam in