Cum să utilizați comanda wc în Linux

Publicat: 2022-07-23
Laptop Linux afișează un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Numărarea numărului de linii, cuvinte și octeți dintr-un fișier este utilă, dar flexibilitatea reală a comenzii Linux wc vine din lucrul cu alte comenzi. Hai să aruncăm o privire.

Ce este comanda wc?

Comanda wc este o aplicație mică. Este unul dintre utilitarele Linux de bază, deci nu este nevoie să-l instalați. Va fi deja pe computerul dvs. Linux.

Puteți descrie ceea ce face în câteva cuvinte. Numărează liniile, cuvintele și octeții dintr-un fișier sau o selecție de fișiere și tipărește rezultatul într-o fereastră de terminal. De asemenea, poate prelua intrarea din fluxul STDIN, ceea ce înseamnă că textul pe care doriți să îl proceseze poate fi transmis în el. Aici wc începe cu adevărat să adauge valoare.

Cum să utilizați pipe pe Linux
LEGATE Cum să utilizați conductele pe Linux

Este un exemplu grozav al mantrei Linux de „fă un lucru și fă-l bine”. Deoarece acceptă intrare prin conductă, poate fi folosit în incantații cu mai multe comandă. După cum vom vedea, acest mic utilitar de sine stătător este de fapt un excelent jucător de echipă.

Un mod în care folosesc wc este ca substituent într-o comandă complicată sau un alias pe care îl pregătesc. Dacă comanda finalizată are potențialul de a fi distructivă și de a șterge fișiere, folosesc adesea wc ca substitut pentru comanda reală și periculoasă.

În acest fel, în timpul dezvoltării comenzii primesc feedback vizual că fiecare fișier este procesat așa cum mă așteptam. Nu există nicio șansă să se întâmple ceva rău în timp ce mă lupt cu sintaxa.

Oricât de simplu este wc , există încă câteva mici ciudatenii despre care trebuie să știi.

Noțiuni introductive cu wc

Cel mai simplu mod de a utiliza wc este să treci numele unui fișier text pe linia de comandă.

 wc lorem.txt 

Utilizarea wc cu un fișier cu o linie lungă de text

Acest lucru face ca wc să scaneze fișierul și să numere liniile, cuvintele și octeții și să le scrie în fereastra terminalului.

Cuvintele sunt considerate orice delimitat de spații albe. Indiferent dacă sunt cuvinte dintr-o limbă reală sau nu, este irelevant. Dacă un fișier nu conține altceva decât „frd g lkj”, acesta tot contează ca trei cuvinte.

Liniile sunt secvențe de caractere terminate fie printr-un retur de cărucior, fie prin sfârșitul fișierului. Nu contează dacă linia se înfășoară în editorul tău sau în fereastra terminalului, până când wc întâlnește o întoarcere de cărucior sau sfârșitul fișierului, este încă aceeași linie.

Primul nostru exemplu a găsit o linie în întregul fișier. Iată conținutul fișierului „lorem.txt”.

 cat lorem.txt 

Conținutul fișierului cu o singură linie lungă

Toate acestea contează ca o singură linie, deoarece nu există retururi de transport. Comparați acest fișier cu un alt fișier, „lorem2.txt”, și modul în care wc îl interpretează.

 wc lorem2.txt
 cat lorem2.txt 

Utilizarea wc cu un fișier cu multe linii

De data aceasta, wc numără 15 linii, deoarece returnările de cărucior au fost inserate în text pentru a începe o nouă linie în anumite puncte. Cu toate acestea, dacă numărați liniile cu text în ele, veți vedea că sunt doar 12.

Celelalte trei linii sunt linii goale la sfârșitul fișierului. Acestea conțin doar returnări de transport. Chiar dacă nu există text în aceste rânduri, a fost începută o nouă linie și astfel wc le numără ca atare.

Putem trece la wc câte fișiere ne dorim.

 wc lorem.txt lorem2.txt 

Folosind wc cu două fișiere

Obținem statisticile pentru fiecare fișier individual și un total pentru toate fișierele.

De asemenea, putem folosi metacaractere astfel încât să putem selecta fișiere care se potrivesc în loc de fișiere denumite în mod explicit.

 wc *.txt *.? 

Utilizarea wc cu wildcards

Opțiunile liniei de comandă

În mod implicit, wc va afișa liniile, cuvintele și octeții din fiecare fișier. Este la fel cu utilizarea opțiunilor -l (linii) -w (cuvinte) și -c (octeți).

 wc lorem.txt
 wc -l -w -c lorem.txt 

Utilizarea wc cu opțiunile linii, cuvinte și octeți

Putem specifica ce combinație de figuri dorim să vedem.

 wc -l lorem.txt

wc -w lorem.txt

wc -c lorem.txt

wc -l -c lorem.txt 

Utilizarea wc cu combinații de opțiuni

O atenție deosebită trebuie acordată ultimei cifre, generată de opțiunea -c (octeți). Mulți oameni greșesc asta ca numărând personajele. De fapt, numără octeții . Numărul de caractere și numărul de octeți ar putea fi același. Dar nu in totdeauna.

Să ne uităm la conținutul unui fișier numit „unicode.txt”.

 cat unicode.txt 

Conținutul unui fișier care conține un caracter non-latin

Are trei cuvinte și un caracter de alfabet non-latin. Vom lăsa wc să proceseze fișierul cu setarea implicită de octeți și o vom face din nou, dar vom solicita caractere cu opțiunea -m (caractere).

 wc unicode.txt
 wc -l -w -m unicode.txt 

Numărarea octeților dintr-un fișier și apoi numărarea caracterelor din același fișier

Există mai mulți octeți decât caractere.

Să aruncăm o privire la descărcarea hexagonală a fișierului și să vedem ce se întâmplă. Opțiunea -C (canonică) a comenzii hexdump afișează octeții din fișier în rânduri de 16, cu echivalentul lor simplu ASCII (dacă există unul) afișat la sfârșitul liniei. Dacă nu există niciun caracter ASCII corespunzător, un punct „ . ” este afișat în schimb.

 hexdump -C unicode.txt 

Un hexdump a unui fișier scurt cu un caracter non-latin

În ASCII, o valoare hexazecimală de 0x20 reprezintă un caracter spațiu. Dacă numărăm trei valori din stânga, vedem că următoarea valoare este un caracter spațiu. Deci primele trei valori 0x62 , 0x6f și 0x79 reprezintă literele din „băiat”.

Trecând peste 0x20 , vedem un alt set de trei valori hexazecimale: 0x63 , 0x61 și 0x74 . Acestea scriu „pisica”. Trecând peste următorul caracter spațiu, vedem încă trei valori pentru literele din „câine”. Acestea sunt 0x64 , 0x5f și 0x67 .

Chiar în spatele cuvântului „câine” putem vedea un caracter de spațiu 0x20 și încă cinci valori hexazecimale. Ultimele două sunt întoarceri de transport, 0x0a .

Ceilalți trei octeți reprezintă caracterul non-latin, pe care l-am sunat în verde. Este un caracter Unicode și este nevoie de trei octeți pentru a-l codifica. Acestea sunt 0xe1 , 0xaf și 0x8a .

Așa că asigurați-vă că știți ce numărați și că octeții și caracterele nu trebuie să fie la fel. De obicei, numărarea octeților este mai utilă, deoarece vă spune ce este de fapt în interiorul fișierului. Numărarea după caractere vă oferă numărul de lucruri reprezentate de conținutul fișierului.

RELATE: Ce sunt codificările de caractere precum ANSI și Unicode și cum diferă?

Preluarea numelor de fișiere dintr-un fișier

Există o altă modalitate de a furniza nume de fișiere pentru wc . Puteți pune numele fișierelor într-un fișier și puteți transmite numele acelui fișier la wc . Deschide fișierul, extrage numele fișierelor și le procesează ca și cum ar fi fost transmise pe linia de comandă. Acest lucru vă permite să stocați o colecție arbitrară de nume de fișiere pentru reutilizare.

Dar există o problemă, și este una mare. Numele de fișiere trebuie să fie terminate nul , nu retur de transport terminat. Adică, după fiecare nume de fișier trebuie să existe un octet nul de 0x00 în loc de octetul obișnuit de returnare a carului 0x0a .

Nu puteți deschide un editor și crea un fișier cu acest format. De obicei, fișierele ca acesta sunt generate de alte programe. Dar, dacă aveți un astfel de fișier, așa l-ați folosi.

Iată fișierul nostru care conține numele fișierelor. Deschiderea în less vă arată caracterele ciudate „ ^@ ” pe care le folosește less pentru a indica octeții nuli.

 mai puțin fișiere-sursă-list.txt 

Un fișier în mai puțin care conține octeți nuli

Pentru a folosi fișierul cu wc , trebuie să folosim --files0-from (citește intrarea de la) și să trecem numele fișierului care conține numele fișierelor.

 wc ---files0-from=source-files-list.txt 

wc procesează fișierul cu nume de fișiere terminate nul

Fișierele sunt procesate exact ca și cum ar fi furnizate pe linia de comandă.

Conducte de intrare la wc

O modalitate mult mai comună, mai flexibilă și mai productivă de a trimite intrare la wc este de a direcționa ieșirea de la alte comenzi în wc . Putem demonstra acest lucru cu comanda echo .

 echo „Numără asta pentru mine” | toaleta
 echo -e „Numără asta\npentru mine” | toaleta 

Folosind echo pentru a trimite intrare la wc

Cea de-a doua comandă echo folosește opțiunea -e (caractere escape) pentru a permite secvențe escape, cum ar fi codul de formatare newline „ \n ”. Aceasta injectează o nouă linie, determinând wc să vadă intrarea ca două linii.

Iată o cascadă de comenzi care își alimentează intrarea de la una la alta.

 găsi ./* -tip f | rev | cut -d'.' -f1 | rev | sortare | unic
  • find caută fișiere ( type -f ) recursiv, începând din directorul curent. rev inversează numele fișierelor.
  • cut extrage primul câmp ( -f1 ) prin definirea delimitatorului câmpului ca punct „ . ” și citirea din „fața” a numelui de fișier inversat până la prima perioadă pe care o găsește. Acum am extras extensia fișierului.
  • rev inversează primul câmp extras.
  • sortează le sortează în ordine alfabetică crescătoare.
  • uniq listează intrări unice în fereastra terminalului.

Lista extensiilor unice din arborele de directoare curent

Această comandă listează toate extensiile de fișiere unice din directorul curent și orice subdirectoare.

Dacă am adăugat opțiunea -c (numărare) la comanda uniq , aceasta ar număra aparițiile fiecărui tip de extensie. Dar dacă vrem să știm câte extensii de fișiere diferite și unice există, putem să aruncăm wc ca ultima comandă de pe linie și să folosim opțiunea -l (linii).

 găsi ./* -tip f | rev | cut -d'.' -f1 | rev | sortare | unic | wc -l 

Adăugarea wc pentru a număra extensiile unice

LEGATE: Cum să utilizați comanda Linux cut

Și, în sfârșit

Iată un ultim truc pe care wc îl poate face pentru tine. Vă va spune lungimea celei mai lungi linii dintr-un fișier. Din păcate, nu vă spune despre ce linie este. Îți dă doar lungimea.

 wc -L taf.c 

Obținerea lungimii celei mai lungi linii dintr-un fișier cu wc

Atenție totuși, că filele sunt numărate ca opt spații. Vizualizate în editorul meu, există trei file cu două spații la începutul acelei linii. Lungimea sa reală este de 124 de caractere. Deci cifra raportată este extinsă artificial.

Aș trata această funcție cu un praf mare de sare. Și prin asta vreau să spun să nu-l folosești. Rezultatul său este înșelător.

În ciuda particularităților sale, wc este un instrument grozav pentru a introduce comenzile introduse atunci când trebuie să numărați tot felul de valori, nu doar cuvintele dintr-un fișier.

RELATE: 37 de comenzi Linux importante pe care ar trebui să le cunoașteți