Linux klippkommando
På Unix -liknande operativsystem tar kommandot klipp bort (”skär ut”) sektioner av varje rad i en fil eller filer.
Detta dokument täcker GNU / Linux-versionen av klipp.
Syntax
cut OPTION... ...
Alternativ
-b, –bytes = LISTA | Välj bara bytes från varje rad som anges i LIST. LIST specificerar en byte, en uppsättning byte eller ett intervall av byte; se Specificera LIST nedan. |
-c, –characters = LIST | Markera endast tecknen från varje rad som anges i LIST. LIST anger ett tecken, en uppsättning tecken eller ett teckenintervall; se Ange LIST nedan. |
-d, –delimiter = DELIM | använd tecken DELIM istället för en flik för fältavgränsaren. |
-f, –fields = LIST | markera endast dessa fält på varje rad; skriv också ut en rad som inte innehåller något avgränsningstecken, såvida inte alternativet -s anges. LIST anger ett fält, en uppsättning fält eller ett fältområde; se Specificera LISTA nedan. |
-n | Det här alternativet ignoreras men ingår av kompatibilitetsskäl. |
–komplement | kompletterar uppsättningen valda byte, tecken eller fält. |
-s, – endast avgränsad | skriver inte ut rader som inte innehåller avgränsare. |
–output-avgränsare = STRING | använder STRING som utmatningsavgränsningssträng. Standard är att använda inmatningsavgränsaren. |
–hjälp | Visa ett hjälpmeddelande och avsluta. |
–version | information om utdataversion och utgång. |
Anvisningar om användning
När du åberopar klippning, använd alternativet -b, -c eller -f, men bara en av dem.
Om inget FIL är angivet läser klipp ut från standardingången.
Ange LIST
Varje LIST består av ett heltal, ett intervall av heltal eller flera heltalsområden åtskilda av kommatecken. Vald ingång skrivs i samma ordning som den läses och skrivs för att matas ut exakt en gång. Ett intervall består av:
Låt oss till exempel säga att du har en fil med namnet data.txt som innehåller följande text:
onetwothreefourfivealphabetagammadeltaepsilon
I det här exemplet är vart och ett av dessa ord åtskilda av ett tabbtecken, inte mellanslag. Tabbet är standardavgränsare för klippning, så det kommer som standard att betrakta ett fält som något som avgränsas av en flik.
För att ”klippa ut” bara det tredje fältet på varje rad, använd kommandot:
cut -f 3 data.txt
… vilket ger följande:
threegamma
Om du istället vill ”klippa” bara det andra till fjärde fältet på varje rad, använd kommandot:
cut -f 2-4 data.txt
… som skickar följande:
twothreefourbetagammadelta
Om du bara vill” klippa ”första andra och fjärde till femte fältet på varje rad (utelämna det tredje fältet), använd kommandot:
cut -f 1-2,4-5 data.txt
… som kommer att mata ut följande:
onetwofourfivealphabetadeltaepsilon
Eller låt oss säga dig vill ha det tredje fältet och varje fält efter det, utelämna de två första fälten. I det här fallet kan du använda kommandot:
cut -f 3- data.txt
… som skickar följande:
threefourfivegammadeltaepsilon
Att specificera ett intervall med LIST gäller också för att klippa tecken (-c) eller byte (-b) från en rad. För att till exempel bara mata ut tredje till tolvte tecknet i varje rad data.txt, använd kommandot:
cut -c 3-12 data.txt
… som kommer att matas ut följande:
etwothrephabetag
Kom ihåg att ”mellanslaget” mellan varje ord egentligen är en enda flik, så båda utmatningsraderna visar tio tecken: åtta alfanumeriska tecken och två tabbtecken. Med andra ord, klipp utelämnar de två första tecknen på varje rad, räknar flikarna som ett tecken vardera; mata ut tecken tre till tolv, räkna flikar som ett tecken vardera; och utelämna alla tecken efter tolfte.
Att räkna byte istället för tecken kommer att resultera i samma utdata i det här fallet, för i en ASCII-kodad textfil representeras varje tecken av en enda byte (åtta bitar ) av data. Så kommandot:
cut -b 3-12 data.txt
… kommer, för vår fildata.txt, att producera exakt samma utdata:
etwothrephabetag
Ange en avgränsare än fliken
Tabbet är standardavgränsaren som klipps av för att bestämma vad som utgör ett fält. Så om filens fält redan avgränsas av flikar behöver du inte ange ett annat avgränsningstecken.
Du kan dock ange vilket tecken som avgränsare.Exempelvis innehåller filen / etc / passwd information om varje användare i systemet, en användare per rad och varje informationsfält avgränsas av ett kolon (”:”). Till exempel kan raden med / etc / passwd för rootanvändaren se ut så här:
root:x:0:0:root:/root:/bin/bash
Dessa fält innehåller följande information, i följande ordning, åtskilda av ett kolon:
- Användarnamn
- Lösenord (visas som x om det är krypterat)
- Användar-ID-nummer (UID)
- Grupp-ID-nummer (GID)
- Kommentarfält (används av fingerkommandot)
- Startkatalog
- Skal
Användarnamnet är det första fältet på raden, så för att visa varje användarnamn i systemet, använd kommandot:
cut -f 1 -d ":" /etc/passwd
… som kommer att matas ut , till exempel:
rootdaemonbinsyschope
(Det finns många fler användarkonton i ett typiskt system, inklusive många konton som är specifika för systemtjänster, men för detta exempel ska vi låtsas det finns bara fem användare.)
Det tredje fältet på varje rad i / etc / passwd-filen är UID (användar-ID-nummer), så för att visa varje användarnamn och användar-ID-nummer, använd kommandot:
… som kommer att mata ut följande, till exempel:
root:0daemon:1bin:2sys:3chope:1000
Som du ser kommer utmatningen att avgränsas som standard med samma avgränsningstecken som anges för ingången. I det här fallet är det ”kolon-tecknet (”: ”). Du kan dock ange en annan avgränsare för in- och utdata. Så om du vill köra det tidigare kommandot men ha utmatningen avgränsad med ett mellanslag, du kan använda kommandot:
cut -f 1,3 -d ":" --output-delimiter=" " /etc/passwd
root 0daemon 1bin 2sys 3chope 1000
Men tänk om du vill att utdata ska avgränsas med en flik ? Att ange ett flikkaraktär på kommandoraden är lite mer komplicerat, eftersom det är ett tecken som inte kan skrivas ut. För att ange det på kommandoraden måste du ”skydda” det från skalet. Detta görs olika beroende på vilket skal du ” använder du igen, men i Linux-standardskalet (bash) kan du ange flikkaraktären med $ ”\ t”. Så kommandot:
cut -f 1,3 -d ":" --output-delimiter=$"\t" /etc/passwd
… kommer att mata ut följande, till exempel:
root0daemon1bin2sys3chope1000
Exempel
cut -c 3 file.txt
Mata ut det tredje tecknet i varje rad i filfilen.txt, utelämna de andra.
cut -c 1-3 file.txt
Mata ut de första tre tecknen i varje rad i filfilen.txt, utelämna resten.
cut -c -3 file.txt
Samma som ovanstående kommando. Mata ut de tre första tecknen i varje rad i filen.txt.
cut -c 3- file.txt
Mata ut de tredje till de sista tecknen i varje rad i filfilen.txt, utelämna de två första tecknen.
cut -d ":" -f 1 /etc/passwd
Mata ut det första fältet i filen / etc / passwd, där fält avgränsas av ett kolon (”:”). Det första fältet i / etc / passwd är användarnamnet, så det här kommandot matar ut alla användarnamn i passwd-filen.
grep "/bin/bash" /etc/passwd | cut -d ":" -f 1,6
Mata ut det första och sjätte fälten, avgränsas av ett kolon, av vilken post som helst i filen / etc / passwd som anger / bin / bash som inloggningsskalet. Detta kommando matar ut användarnamnet och hemkatalogen för alla användare vars inloggningsskal är / bin / bash.