Cum să utilizați comanda Linux cut

Legături rapide

Recomandări cheie

  • Comanda Linux cut vă permite să extrageți porțiuni de text din fișiere sau fluxuri de date.
  • Cut poate funcționa cu octeți, caractere sau câmpuri delimitate, permițându-vă să selectați anumite porțiuni de text pe baza criteriilor dvs.
  • Cut poate fi combinat cu alte utilități precum greg pentru a efectua operațiuni mai complexe

Linux-ul cut comanda vă permite să extrageți porțiuni de text din fișiere sau fluxuri de date. Este util în special pentru lucrul cu date delimitate, cum ar fi fișierele CSV. Iată ce trebuie să știți.

Comanda de tăiere

The cut Command este un veteran al lumii Unix, făcându-și debutul în 1982 ca parte a AT&T System III UNIX. Scopul său în viață este să decupeze secțiuni de text din fișiere sau fluxuri, conform criteriilor pe care le-ați stabilit. Sintaxa sa este la fel de simplă ca și scopul său, dar această simplitate comună îl face atât de util.

În modul vechi UNIX, prin combinare cut cu alte utilitati precum grep puteți crea soluții elegante și puternice la probleme provocatoare. Deși există diferite versiuni ale cut, vom discuta despre versiunea standard GNU/Linux. Rețineți că alte versiuni, în special cea cut găsite în variantele BSD, nu includ toate opțiunile descrise aici.

Puteți verifica ce versiune este instalată pe computer lansând această comandă:

cut --version

Dacă vedeți „GNU coreutils” în rezultat, vă aflați în versiunea pe care o vom descrie în acest articol. Toate versiunile de cut au o parte din această funcționalitate, dar versiunea Linux a avut îmbunătățiri adăugate.

Primii pași Cu tăiere

Fie că introducem informații în cut sau folosind cut pentru a citi un fișier, comenzile pe care le folosim sunt aceleași. Orice puteți face unui flux de intrare cut se poate face pe o linie de text dintr-un fișier și invers. Putem spune cut pentru a lucra cu octeți, caractere sau câmpuri delimitate.

Pentru a selecta un singur octet, folosim -b (byte) opțiune și tell cut ce octet sau octeți dorim. În acest caz, este octetul cinci. Trimitem șirul „how to geek” în cut comanda cu o țeavă, „|”, de la echo .

echo 'how-to geek' | cut -b 5
Extragerea unui singur octet cu tăiere

Al cincilea octet din acel șir este „t”, deci cut răspunde prin tipărirea „t” în fereastra terminalului.

Pentru a specifica un interval folosim o cratimă. Pentru a extrage octeții de la 5 la – și inclusiv – 11, vom lansa această comandă:

echo 'how-to geek' | cut -b 5-11
Extragerea unui interval de octeți cu tăiere

Puteți furniza mai mulți octeți sau intervale unice, separându-i cu virgule. Pentru a extrage octetul 5 și octetul 11, utilizați această comandă:

echo 'how-to geek' | cut -b 5,11
Extragerea a doi octeți cu tăiere

Pentru a obține prima literă a fiecărui cuvânt putem folosi această comandă:

echo 'how-to geek' | cut -b 1,5,8
Extragerea a trei octeți cu tăiere

Dacă utilizați cratima fără un prim număr, cut returnează totul de la poziția 1 până la număr. Dacă utilizați cratima fără un al doilea număr, cut returnează totul de la primul număr până la sfârșitul fluxului sau al liniei.

echo 'how-to geek' | cut -b -6
echo 'how-to geek' | cut -b 8-
Extragerea intervalelor de octeți cu tăiere

Folosind cut With Characters

Folosind cut cu caractere este aproape la fel cu utilizarea lui cu octeți. În ambele cazuri, trebuie avută o atenție deosebită caracterelor complexe. Prin folosirea -c opțiunea (personaj), spunem noi cut să funcționeze în termeni de caractere, nu de octeți.

echo 'how-to geek' | cut -c 1,5,8
echo 'how-to geek' | cut -c 8-11
Extragerea caracterelor și a intervalelor de caractere cu tăiere

Acestea funcționează exact așa cum v-ați aștepta. Dar uitați-vă la acest exemplu. Este un cuvânt de șase litere, așa că întreb cut pentru a returna caracterele de la unu la șase ar trebui să returneze întregul cuvânt. Dar nu este. Este un caracter scurt. Pentru a vedea întregul cuvânt trebuie să cerem personajele de la unu la șapte.

echo 'piñata' | cut -c 1-6
echo 'piñata' | cut -c 1-7
Caracterele speciale pot ocupa mai mult de un caracter

Problema este că caracterul „ñ” este de fapt format din doi octeți. Putem vedea asta destul de ușor. Avem un scurt fișier text care conține această linie de text:

cat unicode.txt
Conținutul fișierului text scurt

Vom examina acel fișier cu hexdump utilitate. Folosind -C Opțiunea (canonică) ne oferă un tabel de cifre hexazecimale cu echivalentul ASCII în dreapta. În tabelul ASCII, „ñ” nu este afișat, în schimb, există puncte reprezentând două caractere neprintabile. Aceștia sunt octeții evidențiați în tabelul hexazecimal.

hexdump -C unicode.txt
Hexdump al fișierului text de testare

Acești doi octeți sunt utilizați de programul de afișare – în acest caz, shell-ul Bash – pentru a identifica „ñ”. Multe caractere Unicode folosesc trei sau mai mulți octeți pentru a reprezenta un singur caracter.

Dacă cerem caracterul 3 sau caracterul 4, ni se arată simbolul pentru un caracter care nu se imprimă. Dacă cerem octeții 3 și 4, shell-ul îi interpretează ca „ñ”.

echo 'piñata' | cut -c 3
echo 'piñata' | cut -c 4
echo 'piñata' | cut -c 3-4
Folosind cut pentru a extrage personajele care alcătuiesc un caracter special

Folosind tăierea cu date delimitate

Putem întreba cut pentru a împărți linii de text folosind un delimitator specificat. În mod implicit, cut folosește un caracter tabulator, dar este ușor să îi spunem să folosească orice vrem. Câmpurile din fișierul „/etc/passwd” sunt separate prin două puncte „:”, așa că îl vom folosi ca delimitator și vom extrage ceva text.

Porțiunile de text dintre delimitatori sunt numite câmpuri și sunt referite la fel ca octeți sau caractere, dar sunt precedate de -f opțiunea (câmpuri). Puteți lăsa un spațiu între „f” și cifră, sau nu.

Prima comandă folosește -d (delimitator) opțiune pentru a spune cut să folosească „:” ca delimitator. Va scoate primul câmp din fiecare linie din fișierul „/etc/passwd”. Aceasta va fi o listă lungă, așa că folosim head cu -n (număr) opțiune pentru a afișa numai primele cinci răspunsuri. A doua comandă face același lucru, dar folosește tail pentru a ne arăta ultimele cinci răspunsuri.

cut -d':' -f1 /etc/passwd | head -n 5
cut -d':' -f2 /etc/passwd | tail -n 5
Extragerea unei game de câmpuri din fișierul /etc/passwd

Pentru a extrage o selecție de câmpuri, enumerați-le ca o listă separată prin virgulă. Această comandă va extrage câmpurile unu până la trei, cinci și șase.

cut -d':' -f1-3,5,6 /etc/passwd | tail -n 5
Extragerea unei game de câmpuri din fișierul /etc/passwd

Prin includerea grep în comandă, putem căuta linii care includ „/bin/bash”. Înseamnă că putem enumera numai acele intrări care au Bash ca shell implicit. Acestea vor fi de obicei conturile de utilizator „normale”. Vom cere câmpuri de la unu la șase, deoarece al șaptelea câmp este câmpul shell implicit și știm deja ce este acesta – îl căutăm.

grep "/bin/bash" /etc/passwd | cut -d':' -f1-6
Extragerea câmpurilor de la unu la șase din fișierul /etc/passwd

O altă modalitate de a include toate câmpurile în afară de unul este să utilizați --complement opțiune. Aceasta inversează selecția câmpului și arată tot ceea ce nu a fost solicitat. Să repetăm ​​ultima comandă, dar să cerem doar câmpul șapte. Apoi vom rula acea comandă din nou cu --complement opțiune.

grep "/bin/bash" /etc/passwd | cut -d':' -f7
grep "/bin/bash" /etc/passwd | cut -d':' -f7 --complement
Folosind opțiunea --complement pentru a inversa o selecție de câmp

Prima comandă găsește o listă de intrări, dar câmpul șapte nu ne oferă nimic pentru a face distincția între ele, așa că nu știm la cine se referă intrările. În a doua comandă, adăugând codul --complement opțiunea obținem totul, cu excepția câmpului șapte.

Tăiat de țevi În tăietură

Rămânând cu fișierul „/etc/passwd”, să extragem câmpul cinci. Acesta este numele real al utilizatorului care deține contul de utilizator.

grep "/bin/bash" /etc/passwd | cut -d':' -f5
Al cincilea câmp din fișierul /etc/passwd poate avea subcâmpuri separate prin virgulă

Al cincilea câmp are subcâmpuri separate prin virgule. Sunt rar populate, așa că apar ca o linie de virgule.

Putem elimina virgulele prin introducerea ieșirii comenzii anterioare într-o altă invocare a cut . A doua instanță a cut folosește virgula “,” ca delimitator. The -s (numai delimitat) opțiunea spune cut pentru a suprima rezultatele care nu au deloc delimitatorul în ele.

grep "/bin/bash" /etc/passwd | cut -d':' -s -f5 | cut -d',' -s -f1
Țevi tăiate în tăietură pentru a face față celor două tipuri de delimitare

Deoarece intrarea rădăcină nu are subcâmpuri cu virgulă în al cincilea câmp, este suprimată și obținem rezultatele pe care le urmărim – o listă cu numele utilizatorilor „adevărați” configurați pe acest computer.

Delimitatorul de ieșire

Avem un fișier mic cu niște valori separate prin virgulă. Câmpurile din aceste date fictive sunt:

  • ID: Un număr de identificare a bazei de date
  • Primul: Prenumele subiectului.
  • Ultimul: Numele subiectului.
  • e-mail: adresa lor de e-mail.
  • Adresa IP: adresa lor IP.
  • Marca: marca autovehiculului pe care îl conduc.
  • Model: Modelul autovehiculului pe care îl conduc.
  • An: Anul în care autovehiculul lor a fost construit.
cat small.csv
Un fișier text cu date CSV false

Dacă îi spunem lui cut să folosească virgula ca delimitator, putem extrage câmpuri la fel ca înainte. Uneori, veți avea o cerință de a extrage date dintr-un fișier, dar nu doriți să includeți delimitatorul de câmp în rezultate. Folosind --output-delimiter putem spune cut ce caracter – sau de fapt, secvența de caractere – să folosim în locul delimitatorului real.

cut -d ',' -f 2,3 small.csv
cut -d ',' -f 2,3 small.csv --output-delimiter=' '
Folosind --output-delimiter pentru a schimba delimitatorul din rezultate

A doua comandă spune cut pentru a înlocui virgulele cu spații.

Putem duce acest lucru mai departe și folosim această caracteristică pentru a converti rezultatul într-o listă verticală. Această comandă folosește un caracter de linie nouă ca delimitator de ieșire. Rețineți „$” pe care trebuie să-l includem pentru ca caracterul nou linie să fie acționat și nu interpretat ca o secvență literală de două caractere.

Vom folosi grep pentru a filtra intrarea pentru Morgana Renwick și întrebați cut pentru a tipări toate câmpurile din câmpul doi până la sfârșitul înregistrării și pentru a utiliza un caracter de linie nouă ca delimitator de ieșire.

grep 'renwick' small.csv | cut -d ',' -f2- --output-delimiter=$''
Convertirea unei înregistrări într-o listă utilizând un caracter newline ca delimitator de ieșire

Un Oldie, dar Goldie

La momentul scrierii, comanda de tăiere mică se apropie de împlinirea a 40 de ani și încă o folosim și scriem despre ea astăzi. Presupun că tăierea textului de astăzi este la fel ca acum 40 de ani. Adică, mult mai ușor atunci când ai instrumentul potrivit la îndemână.

Va invit sa cititi si articolele de mai jos pe langa acestea care sunt cele mai recente

Lasa un comentariu