Hoe de wc-opdracht in Linux te gebruiken

fatmawati achmad zaenuri/Shutterstock.com

Het aantal regels, woorden en bytes in een bestand tellen is handig, maar de echte flexibiliteit van Linux wc commando komt van het werken met andere commando’s. Laten we kijken.

Wat is het wc-commando?

De wc commando is een kleine applicatie. Het is een van de belangrijkste Linux-hulpprogramma’s, dus het is niet nodig om het te installeren. Het staat al op je Linux-computer.

Je kunt in een paar woorden beschrijven wat het doet. Het telt de regels, woorden en bytes in een bestand of een selectie van bestanden en drukt het resultaat af in een terminalvenster. Het kan ook zijn invoer uit de STDIN-stroom halen, wat betekent dat de tekst die u wilt verwerken erin kan worden doorgesluisd. Dit is waar wc begint echt waarde toe te voegen.

Het is een geweldig voorbeeld van de Linux-mantra van “doe één ding en doe het goed.” Omdat het doorgesluisde invoer accepteert, kan het worden gebruikt in bezweringen met meerdere opdrachten. Zoals we zullen zien, is dit kleine zelfstandige hulpprogramma eigenlijk een geweldige teamspeler.

Een manier die ik gebruik wc is als een tijdelijke aanduiding in een gecompliceerde opdracht of alias die ik aan het koken ben. Als het voltooide commando het potentieel heeft om destructief te zijn en bestanden te verwijderen, gebruik ik vaak wc als een stand-in voor het echte, gevaarlijke commando.

Op die manier krijg ik tijdens de ontwikkeling van de opdracht visuele feedback dat elk bestand wordt verwerkt zoals ik had verwacht. Er is geen kans dat er iets ergs gebeurt terwijl ik worstel met de syntaxis.

Zo simpel als wc is, zijn er nog een paar kleine eigenaardigheden die je moet weten.

Aan de slag met wc

De eenvoudigste manier om te gebruiken wc is om de naam van een tekstbestand op de opdrachtregel door te geven.

wc lorem.txt

WC gebruiken met een bestand met één lange regel tekst

Dit veroorzaakt wc om het bestand te scannen en de regels, woorden en bytes te tellen en ze naar het terminalvenster te schrijven.

Woorden worden beschouwd als alles dat wordt begrensd door witruimte. Of het nu woorden uit een echte taal zijn of niet, doet er niet toe. Als een bestand niets anders bevat dan “frd g lkj”, telt het nog steeds als drie woorden.

Regels zijn reeksen tekens die worden afgesloten met een regelterugloop of het einde van het bestand. Het maakt niet uit of de regel doorloopt in uw editor of in het terminalvenster, tot wc een regelterugloop of het einde van het bestand tegenkomt, is het nog steeds dezelfde regel.

Ons eerste voorbeeld vond één regel in het hele bestand. Hier is de inhoud van het bestand “lorem.txt”.

cat lorem.txt

De inhoud van het bestand met één lange regel

Dat alles telt als een enkele regel omdat er geen regelterugloop is. Vergelijk dit met een ander bestand, “lorem2.txt”, en hoe wc interpreteert het.

wc lorem2.txt
cat lorem2.txt

WC gebruiken met een bestand met veel regels

deze keer, wc telt 15 regels omdat er regelterugloop in de tekst is ingevoegd om op specifieke punten een nieuwe regel te beginnen. Als u echter de regels met tekst telt, ziet u dat er maar 12 zijn.

De andere drie regels zijn lege regels aan het einde van het bestand. Deze bevatten alleen retourzendingen. Ook al staat er geen tekst in deze regels, er is een nieuwe regel gestart en zo wc telt ze als zodanig.

We kunnen zoveel bestanden doorgeven aan: wc zoals we willen.

wc lorem.txt lorem2.txt

WC gebruiken met twee bestanden

We krijgen de statistieken voor elk afzonderlijk bestand en een totaal voor alle bestanden.

We kunnen ook jokertekens gebruiken, zodat we overeenkomende bestanden kunnen selecteren in plaats van bestanden met expliciete namen.

wc *.txt *.?

WC gebruiken met jokertekens

De opdrachtregelopties

Standaard, wc zal de regels, woorden en bytes in elk bestand weergeven. Het is hetzelfde als het gebruik van de -l (lijnen) -w (woorden) en -c (bytes) opties.

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

WC gebruiken met de opties voor regels, woorden en bytes

We kunnen aangeven welke combinatie van cijfers we willen zien.

wc -l lorem.txt

wc -w lorem.txt

wc -c lorem.txt

wc -l -c lorem.txt

Wc gebruiken met combinaties van opties

Speciale aandacht moet worden besteed aan het laatste cijfer, gegenereerd door de -c (bytes) optie. Veel mensen verwarren dit met het tellen van de karakters. Het telt eigenlijk bytes. Het aantal karakters en het aantal bytes zou wel eens hetzelfde kunnen zijn. Maar niet altijd.

Laten we eens kijken naar de inhoud van een bestand met de naam “unicode.txt”.

cat unicode.txt

De inhoud van een bestand dat een niet-Latijns teken bevat

Het heeft drie woorden en een niet-Latijns alfabetteken. We laten wc verwerk het bestand met de standaardinstelling van bytesen we zullen het opnieuw doen, maar verzoek karakters met de -m (tekens) optie.

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

De bytes in een bestand tellen en vervolgens de tekens in hetzelfde bestand tellen

Er zijn meer bytes dan er tekens zijn.

Laten we eens kijken naar de hexdump van het bestand en kijken wat er aan de hand is. De hexdump commando’s -C (canonieke) optie geeft de bytes in het bestand weer in regels van 16, met hun gewone ASCII-equivalent (als die er is) aan het einde van de regel. Als er geen corresponderend ASCII-teken is, wordt een punt “.” wordt in plaats daarvan weergegeven.

hexdump -C unicode.txt

Een hexdump van een kort bestand met een niet-Latijns teken

In ASCII is een hexadecimale waarde van 0x20 staat voor een spatieteken. Als we drie waarden vanaf links tellen, zien we dat de volgende waarde een spatie is. Dus de eerste drie waarden 0x62, 0x6fen 0x79 vertegenwoordigen de letters in “jongen”.

Springen over de 0x20zien we nog een set van drie hexadecimale waarden: 0x63, 0x61en 0x74. Deze spellen ‘kat’. Als we over het volgende spatieteken springen, zien we nog drie waarden voor de letters in “hond”. Dit zijn 0x64, 0x5fen 0x67.

Direct achter het woord “hond” zien we een spatie 0x20, en nog vijf hexadecimale waarden. De laatste twee zijn koetsretouren, 0x0a.

De andere drie bytes vertegenwoordigen het niet-Latijnse karakter, dat we groen hebben aangegeven. Het is een Unicode-teken en er zijn drie bytes nodig om het te coderen. Dit zijn 0xe1, 0xafen 0x8a.

Zorg er dus voor dat u weet wat u telt, en dat bytes en tekens niet hetzelfde hoeven te zijn. Gewoonlijk is het tellen van bytes nuttiger omdat het je vertelt wat het eigenlijk is binnen het bestand. Tellen op karakters geeft je het aantal dingen vertegenwoordigd door de inhoud van het bestand.

VERWANT: Wat zijn tekencoderingen zoals ANSI en Unicode, en hoe verschillen ze?

Bestandsnamen uit een bestand halen

Er is een andere manier om bestandsnamen te geven aan: wc . U kunt de bestandsnamen in een bestand plaatsen en de naam doorgeven van Dat bestand naar wc. Het opent het bestand, extraheert de bestandsnamen en verwerkt ze alsof ze op de opdrachtregel zijn doorgegeven. Hiermee kunt u een willekeurige verzameling bestandsnamen opslaan voor hergebruik.

Maar er is een probleem, en het is een grote. De bestandsnamen moeten zijn nul beëindigd, niet koetsretour beëindigd. Dat wil zeggen, na elke bestandsnaam moet er een null-byte staan ​​van 0x00 in plaats van de gebruikelijke regelterugloopbyte 0x0a.

U kunt geen editor openen en een bestand maken met deze indeling. Meestal worden dergelijke bestanden gegenereerd door andere programma’s. Maar als je zo’n bestand hebt, zou je het zo gebruiken.

Hier is ons bestand met de bestandsnamen. Openen in less laat je het vreemde zien”^@” tekens die less gebruikt om null-bytes aan te geven.

less source-files-list.txt

Een bestand in minder dat null-bytes bevat

Om het bestand te gebruiken met wcwe moeten gebruiken --files0-from (lees invoer van) optie en geef de naam door van het bestand met de bestandsnamen.

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

wc verwerkt het bestand met null-beëindigde bestandsnamen

De bestanden worden precies verwerkt alsof ze op de opdrachtregel zijn aangeleverd.

Leidinginvoer naar wc

Een veel gebruikelijkere, flexibelere en productievere manier om input te sturen naar wc is om de uitvoer van andere commando’s te pipen in wc . We kunnen dit aantonen met de echo opdracht.

echo "Count this for me" | wc
echo -e "Count thisnfor me" | wc

Echo gebruiken om invoer naar wc te sturen

De seconde echo commando gebruikt de -e (escaped characters) optie om escaped sequenties toe te staan, zoals de “nnieuwe regel opmaakcode. Dit injecteert een nieuwe regel, waardoor wc om de invoer als twee regels te zien.

Hier is een cascade van commando’s die hun invoer van de ene naar de andere sturen.

find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq
  • vind zoekt naar bestanden (type -f) recursief, beginnend in de huidige directory. rev keert de bestandsnamen om.
  • snee extraheert het eerste veld (-f1) door het veldscheidingsteken te definiëren als een punt”.” en lezen vanaf de “voorkant” van de omgekeerde bestandsnaam tot aan de eerste periode die wordt gevonden. We hebben nu de bestandsextensie uitgepakt.
  • ref keert het geëxtraheerde eerste veld om.
  • soort sorteert ze in oplopende alfabetische volgorde.
  • uniek geeft een overzicht van unieke vermeldingen in het terminalvenster.

De lijst met unieke extensies in de huidige directorystructuur

Deze opdracht geeft een overzicht van alle unieke bestandsextensies in de huidige map en eventuele submappen.

Als we de . hebben toegevoegd -c (tel) optie naar de uniq commando het zou tellen de gebeurtenissen van elk type extensie. Maar als we willen weten hoeveel verschillende, unieke bestandsextensies er zijn, kunnen we laten vallen wc als het laatste commando op de regel, en gebruik de -l (lijnen) optie.

find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq | wc -l

WC toevoegen om de unieke extensies te tellen

VERWANT: Hoe het Linux-cut-commando te gebruiken?

En tenslotte

Hier is nog een laatste truc wc voor u kan doen. Het vertelt je de lengte van de langste regel in een bestand. Helaas staat er niet bij welke regel het is. Het geeft je gewoon de lengte.

wc -L taf.c

De lengte krijgen van de langste regel in een bestand met wc

Pas echter op, dat tabbladen worden geteld als acht spaties. In mijn editor zijn er drie tabs met twee spaties aan het begin van die regel. De werkelijke lengte is 124 tekens. Het gerapporteerde cijfer is dus kunstmatig uitgebreid.

Ik zou deze functie met een flinke korrel zout behandelen. En daarmee bedoel ik niet gebruiken. De output is misleidend.

Ondanks zijn eigenaardigheden, wc is een geweldig hulpmiddel om in doorgesluisde commando’s te vallen wanneer je allerlei soorten waarden moet tellen, niet alleen de woorden in een bestand.

VERWANT: 37 Belangrijke Linux-opdrachten die u moet kennen

Leave a Comment