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
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
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
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
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 *.?
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
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
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
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
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
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 die eerste drie waarden 0x62
, 0x6f
en 0x79
vertegenwoordigen de letters in “jongen”.
Springen over de 0x20
zien we nog een set van drie hexadecimale waarden: 0x63
, 0x61
en 0x74
. Deze spellen ‘kat’. Als we over het volgende spatieteken springen, zien we nog drie waarden voor de letters in “hond”. Dit zijn 0x64
, 0x5f
en 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
, 0xaf
en 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.
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 de vreemde “^@
” tekens die less
gebruikt om null-bytes aan te geven.
less source-files-list.txt
Om het bestand te gebruiken met wc
we 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
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
De seconde echo
commando gebruikt de -e
(escaped characters) optie om escaped sequenties toe te staan, zoals de “n
” nieuwe 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. - rev keert het geëxtraheerde eerste veld om.
- soort sorteert ze in oplopende alfabetische volgorde.
- uniek geeft een overzicht van unieke vermeldingen in het terminalvenster.
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
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
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.