De Help Desk punt NL
Kennisbank
De Helpdesk > De Helpdesk > Kennisbank

GNU-utility's

Oplossing

GNU is een recursief acroniem en staat voor „GNU's not UNIX”. De GNU-software is Unix-compatible software die wordt uitgegeven door de Free Software Foundation, de FSF. De echte kracht in de GNU-utility's zit hem in het feit dat complexe taken kunnen worden opgebroken in snelle, kleine stukjes. Niet alle GNU-utility's worden hier genoemd, alleen de meest gebruikte. Voor een compleet overzicht zie http://www.gnu.org. Van de GNU-utility's die hier worden besproken, worden ook lang niet alle mogelijkheden genoemd. Die kunnen in manual pages en andere bronnen gevonden worden.

Zie ook sectie Pipelines, redirecting en backquotes over hoe je met input en output werkt.

Cat

Een van de simpelste progammaatjes. Het toont de inhoud van een bepaald bestand dat je opgeeft: cat file. Je kunt het ook gebruiken om bestanden mee aan elkaar te plakken: cat file1 file2 > filesamen.

Grep

Grep is een afkorting voor General Regural Expression Parser. Het is een programma dat met behulp van reguliere expressies ergens naar kan zoeken. Met reguliere expressies kun je zoekpatronen maken om naar bepaalde stukken tekst te zoeken. (Maar er zijn wel dingen te bedenken die onmogelijk zijn om in een „regexp” te formuleren.) Naast grep kunnen regexps ook in een aantal andere programma's gebruikt worden. Een tweetal simpele voorbeelden van het gebruik van grep:

grep -i foo file.txt
ps aux | grep firefox

Met het eerste commando wordt naar de string foo gezocht in het bestand file.txt. De optie -i zorgt ervoor dat er niet op hoofd- en kleine letters gelet wordt (ignore case). Met het tweede commando wordt in de output van ps gezocht naar het woord firefox.

In grep kun je de volgende reguliere expressies gebruiken. Er wordt telkens aangegen waar een expressie mee zal matchen.

ExpressieBetekenis
^ begin van de regel
$ eind van de regel
< begin van een woord
> eind van een woord
. elk enkel karakter
[str] elk karakter in de string str
[^str] elk karakter dat niet in de string str voorkomt
[a-b] elk karakter tussen a en b
\ heft speciale betekenis van het teken erna op (escapen)
* 0 of meer herhalingen van het vorige item

Als je grep -E of egrep gebruikt, kun je zelfs nog meer expressies vormen:

ExpressieBetekenis
+ 1 of meer herhalingen van het vorige item
? 0 of 1 herhaling van het vorige item
{j} exact j herhalingen van het vorige item
{j,} j of meer herhalingen van het vorige item
{,k} maximaal k herhalingen van het vorige item
{j,k} j tot k herhalingen van het vorige item
s||t s of t
(exp) behandel exp als een enkel item

Strings

Strings zoekt in een opgegeven bestand naar strings. Een string is een willekeurig serie karakters, zoals dryl of a&3?. Je kunt dit gebruiken om in bestanden die geen tekstbestand zijn te zoeken naar leesbare informatie. Het gebruik is eenvoudig: strings bestand. Standaard wordt er naar strings gezocht van minstens 4 tekens lang, maar met de optie --bytes=n kun je dit veranderen in n tekens.

Sort en uniq

Sort alfabetiseert de input. Je kunt het in combinatie met uniq gebruiken. Uniq verwijdert dubbele regels uit gesorteerde input.

Cut

Cut kan een bepaald stukje uit elke regel knippen. Om bijvoorbeeld van byte 2 tot en met byte 4 van elke regel uit een bestand te tonen, gebruik je cut -b 2-4 foo. (Door geen bestandsnaam op te geven, kun je cut ook in een pipe gebruiken om een stuk uit de standaard invoer te knippen.) Je kunt ook bepaalde kolommen uitknippen als je aangeeft welk teken de kolommen van elkaar onderscheidt: cut -d , -f 12 foo. Dit toont kolom 12 in een bestand waarin de kolommen gescheiden worden door komma's.

Sed

Sed is een „streaming editor”. Hij kan tekst bewerken tijdens het doorwandelen van die tekst. Sed heeft vele mogelijkheden. Een voorbeeld:

for i in *.avi; do mv \"$i\" \"` echo $i | sed -e "s/oud/nieuw/" `\"; done

De for-constructie is een mogelijkheid van Bash om iets met meer meerdere bestanden te doen. Zie ook hoofdstuk Bash scripting. Met dit commando worden alle bestanden die eindigen op .avi hernoemd naar een naam waarin alle voorkomens van oud in de bestandsnamen zijn vervangen door nieuw.

Hetzelfde kan ook eenvoudiger bereikt worden met alleen Bash:

for f in *.txt; do mv "$f" "${f%.txt}.bak"; done

Naast in de manual page is ook veel informatie te vinden in de info page, te bekijken met info sed.

Awk

Awk is vooral sterk in het werken met tabellen. Net zoals bij sed en grep kun je reguliere expressies gebruiken om bepaalde tekst te vinden. Je kunt de eerste kolom uit een bestand (bestaande uit een tabel gescheiden door spaties) halen met awk '{print $1}' file. Alle kolommen zijn op te vragen met $1, $2, etc.

Veel werk dat gedaan kan worden met een combinatie van verschillende andere GNU-utility's achter elkaar, kan met awk in een keer. Je kunt bijvoorbeeld het IP-adres van eth0 uit de output van ifconfig filteren met:

/sbin/ifconfig eth0 | awk '/inet addr/ {sub("addr:", "", $2); print $2}'

Alle mogelijkheden van awk staan beschreven in de manual page: man awk.

Tr

Met tr (translate) kun je een serie tekens of letters laten vervangen door een andere serie tekens of letters. Beide series moeten tussen enkele quotes geplaatst worden. Met tr '!?”:;[]{}(),.' '' < file.txt worden alle leestekens uit file.txt verwijderd. Om alle hoofdletters in kleine letters om te zetten, kun je tr 'A-Z' 'a-z' < file.txt gebruiken. Maar tr kent nog wat meer functies. Zo kun je om meerdere spaties om te zetten in enkele tr -s ' ' < file.txt gebruiken.

Tee

Stuurt output zowel naar een bestand als naar de standard output, oftewel naar het beeldscherm. Een voorbeeld: ls | tee test laat een bestandsoverzicht op het scherm zien, maar zet het ook in bestand test.

Locate

Dit is het simpelste en snelste commando om naar bestanden te laten zoeken. Daarbij wordt niet echt op je harde schijf gezocht, maar in een database met bestandsnamen. Die wordt normaal gesproken 's nachts geüpdatet. (Dus wees gerust, dat geratel in het holst van de nacht zijn geen crackers!) Om het handmatig te updaten gebruik je updatedb. Als je bijv. locate bash intikt, worden alle bestandsnamen waar „bash” in voorkomt getoond. Er kunnen ook wildcards en reguliere expressies gebruikt worden. Voorbeeld: locate [mM]akefile. Bijbehorend zijn whereis en whatis. Whereis zoekt naar binary's, source code en manual pages. Whatis toont de omschrijving uit de manual page van een bepaald programma.

Find

Dit is een utility waarmee echt op je harde schijf wordt gezocht. Eerst moet de begindirectory opgegeven worden, daarna de zoekopties. Voorbeeld: find / -name Makefile -print Hiermee worden alle Makefile-bestanden in / en in alle subdirectory's daarvan getoond. Door -iname te gebruiken wordt niet op hoofd- en kleine letters gelet (ignore case). De optie -print is eigenlijk standaard. Je kunt het ook vervangen door -ls om output te krijgen in de vorm van ls -li.

Als je weet hoe groot het gezochte bestand is, kun je de optie -size gebruiken. Zet daar een getal achter en de eenheid (c voor bytes, k voor kilobytes). Voorbeeld: find /usr -size 100k.

Als je een bepaald type bestand zoekt, kun je de optie -type gebruiken. Zet daar een letter achter om aan te geven wat voor type bestand je zoekt. Een b staat voor block (buffered) special, c voor character (unbuffered) special, d voor directory, p voor een named pipe (FIFO), f voor een normaal bestand, l voor een symbolic link en s voor een socket. Deze letters zie je ook helemaal links als je ls -l gebruikt, met als enige verschil dat de f daar een streepje is. Voorbeeld: find /tmp -type l.

Om iets met de gevonden bestanden te laten doen, kan de optie -exec gebruikt worden. Zet daar een commando achter dat voor alle bestanden uitgevoerd moet worden. Gebruik daarin '{}' (met de enkele quotes) om de bestandsnaam te laten invullen op die plaats en ';' om aan te geven dat het einde van het commando is bereikt. Om bijvoorbeeld naar alle .c-bestanden in /usr/src/linux met de tekst foo erin te zoeken, gebruik je:

find /usr/src/linux -name "*.c" -exec grep -l foo '{}' ';'

Xargs

De exec-optie van find voert per gevonden bestand een bepaald commando uit. Xargs daarentegen voert een bepaald commando uit op vele bestanden. Dat gaat aanzienlijk sneller. Het voorbeeld bij find kan met xargs als volgt worden gedaan:

find /usr/src/linux -name "*.c" | xargs grep -l foo

Een andere mogelijkheid die je zou kunnen bedenken om hetzelfde te doen is het commando:

grep -l foo ` find /usr/src/linux -name "*.c" `

Dat zal echter mislukken als het commando tussen backquotes een langere output heeft dan de maximale lengte die een commando mag hebben.

Bestandsnamen (en directorynamen) met spaties erin zullen xargs verwarren, omdat hij spaties ziet als een teken dat de volgende bestandsnaam eraan komt. Om dat probleem te verhelpen, moet je de optie -print0 (met het cijfer nul, niet de letter o) gebruiken i.p.v. -print bij grep (zodat er een null character tussen de bestandsnamen komt) en de optie -0 bij xargs (zodat xargs het null character ziet als bestandsnaamonderscheider).

Normaal gesproken werkt xargs automatisch, maar door commando's als rm kan om bevestiging gevraagd worden. Gebruik dan de optie --interactive of -p om xargs interactief te maken.

File

Met file kun je laten zien wat voor soort data een bestand bevat. Erg handig voor bestanden waarvan je niet direct weet wat het voor moet stellen. Voorbeeld: file 5×8.pcf.

Ldd

Met ldd kun je laten zien welke gedeelde (shared) library's een bepaald programma nodig heeft. Voorbeeld: ldd /usr/bin/perl.

Touch

Met touch file verander je de access time van een bestand in de huidige datum en tijd. Als het bestand file nog niet bestaat, maakt het een nieuw leeg bestand aan. Daar wordt touch ook vaak voor gebruikt.

Split

Split kan een groot bestand opsplitsen in kleinere stukken. Een voorbeeld: split -b1400k JDK.tar.gz splitst JDK.tar.gz op in blokken van 1,4 MB. De opgehakte bestanden eindigen op aa, ab, ac enz. Om ze weer aan elkaar te plakken kun je simpelweg cat split_file* > file gebruiken.

Diff

Diff laat de verschillen zien tussen twee bestanden. Het gebruik is eenvoudig: diff file1 file2. Geef je twee directory's op, dan worden verschillen getoond tussen elk tweetal gelijknamige bestanden in de directory's. Met de optie --recursive worden ook subdirectory's meegenomen. Met dit programma worden patches gemaakt.

Patch

Kan gebruikt worden om bijv. source code te upgraden tot de nieuwste versie. Als je bijvoorbeeld de source van kernel 2.6.20 hebt en je downloadt een patch (gemaakt met diff) met de verschillen tussen 2.6.20 en 2.6.21, dan kun je je code upgraden naar 2.6.21. Patches zijn klein en zorgen ervoor dat je niet de hele source code opnieuw hoeft te downloaden. Het gebruik: patch origineel patchfile.

 
Was dit artikel bruikbaar? ja / nee
Gerelateerde artikelen Bash scripting
Backup en restore met tar
Basiskennis
VI
VI de onvergetelijke editor
Hernoemen meerdere bestanden
Internationalisering
Linux commando overzicht
Tips & trucs
De meestgebruikte console opdrachten in Linux
Artikel details
Artikel ID: 737
Categorie: Linux handboek 2008
Zoekwoorden gnu, utlis, grep, cat, strings, sort, sed, list, awk, tr, tee, locate, find, xargs, file, ldd, touch, split, diff, patch
Datum toegevoegd: 6-Dec-2008 03:21:46
Aantal bekeken: 294
Beoordeling (Stemmen): Artikel beoordeeld 5.0/5.0 (1)

 
« Ga terug