Linux cut-commando
Op Unix net als besturingssystemen verwijdert (“cut out”) secties van elke regel van een bestand of bestanden.
Dit document behandelt de GNU / Linux-versie van cut.
Syntaxis
cut OPTION... ...
Opties
-b, –bytes = LIST | Selecteer alleen de bytes van elke regel zoals gespecificeerd in LIST. LIST specificeert een byte, een set bytes of een bereik van bytes; zie LIJST specificeren hieronder. |
-c, –characters = LIST | Selecteer alleen de tekens van elke regel zoals gespecificeerd in LIST. LIST specificeert een teken, een reeks tekens of een reeks tekens; zie LIJST specificeren hieronder. |
-d, –delimiter = DELIM | gebruik karakter DELIM in plaats van een tab voor het veldscheidingsteken. |
-f, –fields = LIST | selecteer alleen deze velden op elke regel; druk ook elke regel af die geen scheidingsteken bevat, tenzij de optie -s is gespecificeerd. LIST specificeert een veld, een set velden of een reeks velden; zie LIJST specificeren hieronder. |
-n | Deze optie wordt genegeerd, maar is om compatibiliteitsredenen opgenomen. |
–complement | vullen de set geselecteerde bytes, tekens of velden aan. |
-s, –only-delimited | druk geen regels af die geen scheidingstekens bevatten. |
–output-delimiter = STRING | gebruik STRING als de uitvoerscheidingstekenreeks. Standaard wordt het invoerscheidingsteken gebruikt. |
–help | Toon een helpbericht en sluit af. |
–version | uitvoer versie-informatie en sluit af. |
Gebruiksinformatie
Gebruik bij het aanroepen van cut de -b, -c, of -f optie, maar slechts één ervan.
Als er geen FILE is gespecificeerd, cut reads van de standaard input.
LIST specificeren
Elke LIST bestaat uit een geheel getal, een reeks gehele getallen of meerdere gehele getallen, gescheiden door kommas. De geselecteerde invoer wordt in dezelfde volgorde geschreven als waarin deze wordt gelezen, en wordt precies één keer naar de uitvoer geschreven. Een bereik bestaat uit:
Stel, u heeft bijvoorbeeld een bestand met de naam data.txt dat de volgende tekst bevat:
onetwothreefourfivealphabetagammadeltaepsilon
In dit voorbeeld wordt elk van deze woorden gescheiden door een tab-teken, geen spaties. Het tab-teken is het standaardscheidingsteken van cut, dus het zal standaard een veld beschouwen als alles wat door een tab wordt begrensd.
Om alleen het derde veld van elke regel te “knippen”, gebruik je het commando:
cut -f 3 data.txt
… wat het volgende zal opleveren:
threegamma
Als u in plaats daarvan alleen het tweede tot en met vierde veld van elke regel wilt “knippen”, gebruikt u de volgende opdracht:
cut -f 2-4 data.txt
… wat het volgende zal opleveren:
twothreefourbetagammadelta
Als je alleen de eerste door- tweede en vierde-tot-vijfde veld van elke regel (zonder het derde veld), gebruik het commando:
cut -f 1-2,4-5 data.txt
… wat het volgende zal opleveren:
onetwofourfivealphabetadeltaepsilon
Of, laten we zeggen dat u wil het derde veld en elk veld erna, zonder de eerste twee velden. In dit geval zou je het commando kunnen gebruiken:
cut -f 3- data.txt
… wat het volgende zal opleveren:
threefourfivegammadeltaepsilon
Het specificeren van een bereik met LIST is ook van toepassing op het knippen van tekens (-c) of bytes (-b) van een regel. Om bijvoorbeeld alleen het derde tot en met twaalfde teken van elke regel data.txt uit te voeren, gebruikt u het volgende commando:
cut -c 3-12 data.txt
… het volgende:
etwothrephabetag
Onthoud dat de “spatie” tussen elk woord eigenlijk een enkel tab-teken is, dus beide uitvoerregels geven tien tekens weer: acht alfanumerieke tekens en twee tabtekens. Met andere woorden, knippen is het weglaten van de eerste twee karakters van elke regel, waarbij tabs als één karakter worden geteld; het uitvoeren van tekens drie tot en met twaalf, waarbij tabbladen elk als één teken worden geteld; en het weglaten van tekens na de twaalfde.
Het tellen van bytes in plaats van tekens zal in dit geval resulteren in dezelfde uitvoer, omdat in een ASCII-gecodeerd tekstbestand elk teken wordt vertegenwoordigd door een enkele byte (acht bits ) Van de gegevens. Dus het commando:
cut -b 3-12 data.txt
… zal, voor ons bestand data.txt, exact dezelfde output produceren:
etwothrephabetag
Een ander scheidingsteken dan een tab specificeren
Het tab-teken is het standaardscheidingsteken dat wordt gebruikt om te bepalen wat een veld is. Dus als de velden van uw bestand al zijn gescheiden door tabs, hoeft u geen ander scheidingsteken op te geven.
U kunt echter elk teken als scheidingsteken specificeren.Het bestand / etc / passwd bevat bijvoorbeeld informatie over elke gebruiker op het systeem, één gebruiker per regel, en elk informatieveld wordt gescheiden door een dubbele punt (“:”). De regel / etc / passwd voor de rootgebruiker kan er bijvoorbeeld als volgt uitzien:
root:x:0:0:root:/root:/bin/bash
Deze velden bevatten de volgende informatie, in de volgende volgorde, gescheiden door een dubbele punt:
- Gebruikersnaam
- Wachtwoord (weergegeven als x indien versleuteld)
- Gebruikers-ID-nummer (UID)
- Groeps-ID-nummer (GID)
- Commentaarveld (gebruikt door het vingercommando)
- Basismap
- Shell
De gebruikersnaam is het eerste veld op de regel, dus om elke gebruikersnaam op het systeem weer te geven, gebruikt u het commando:
cut -f 1 -d ":" /etc/passwd
… wat zal uitvoeren , bijvoorbeeld:
rootdaemonbinsyschope
(Er zijn veel meer gebruikersaccounts op een typisch systeem, inclusief veel accounts die specifiek zijn voor systeemservices, maar voor dit voorbeeld zullen we doen alsof er zijn slechts vijf gebruikers.)
Het derde veld van elke regel in het / etc / passwd-bestand is de UID (gebruikers-ID-nummer), dus om elke gebruikersnaam en gebruikers-ID-nummer weer te geven, gebruikt u het commando:
… wat het volgende zal opleveren, bijvoorbeeld:
root:0daemon:1bin:2sys:3chope:1000
Zoals je kunt zien, zal de output zijn standaard gescheiden met hetzelfde scheidingsteken dat voor de invoer is opgegeven. In dit geval is dat de dubbele punt (“:”). U kunt echter een ander scheidingsteken specificeren voor de invoer en uitvoer. Dus als u de vorige opdracht wilt uitvoeren, maar de uitvoer wilt laten scheiden door een spatie, je zou het commando kunnen gebruiken:
cut -f 1,3 -d ":" --output-delimiter=" " /etc/passwd
root 0daemon 1bin 2sys 3chope 1000
Maar wat als je wilt dat de uitvoer wordt gescheiden door een tab Het specificeren van een tab-teken op de opdrachtregel is iets gecompliceerder, omdat het een niet-afdrukbaar teken is. Om het op de opdrachtregel te specificeren, moet u het “beschermen” tegen de shell. Dit wordt anders gedaan, afhankelijk van welke shell u ” hergebruikt, maar in de Linux standaard shell (bash), kun je het tab-teken specificeren met $ “\ t”. Dus het commando:
cut -f 1,3 -d ":" --output-delimiter=$"\t" /etc/passwd
… zal het volgende uitvoeren, bijvoorbeeld:
root0daemon1bin2sys3chope1000
Voorbeelden
cut -c 3 file.txt
Voer het derde teken uit van elke regel van het bestand file.txt, waarbij de andere worden weggelaten.
cut -c 1-3 file.txt
Voer de eerste drie tekens van elke regel van het bestand file.txt uit, en laat de rest weg.
cut -c -3 file.txt
Hetzelfde als het bovenstaande commando. Voer de eerste drie tekens van elke regel van file.txt uit.
cut -c 3- file.txt
Voer de derde tot en met de laatste tekens van elke regel van het bestand file.txt uit, zonder de eerste twee karakters.
cut -d ":" -f 1 /etc/passwd
Voer het eerste veld van het bestand / etc / passwd uit, waar velden worden gescheiden door een dubbele punt (“:”). Het eerste veld van / etc / passwd is de gebruikersnaam, dus dit commando zal elke gebruikersnaam in het passwd-bestand uitvoeren.
grep "/bin/bash" /etc/passwd | cut -d ":" -f 1,6
Voer de eerste en zesde velden uit, gescheiden door een dubbele punt, van elk item in het / etc / passwd-bestand dat / bin / bash specificeert als de login-shell. Dit commando geeft de gebruikersnaam en homedirectory weer van elke gebruiker wiens login-shell / bin / bash is.