
Het Linux grep command is een hulpprogramma voor het matchen van tekenreeksen en patronen dat overeenkomende regels uit meerdere bestanden weergeeft. Het werkt ook met doorgesluisde uitvoer van andere opdrachten. We laten je zien hoe.
Het verhaal achter grep
De grep commando is om drie redenen beroemd in Linux- en Unix-kringen. Ten eerste is het enorm nuttig. Ten tweede kan de rijkdom aan opties overweldigend zijn. Ten derde is het van de ene op de andere dag geschreven om in een bepaalde behoefte te voorzien. De eerste twee zijn geweldig; de derde is enigszins afwijkend.
Ken Thompson had de zoekmogelijkheden voor reguliere expressies uit de ed editor (spreek uit als ee-dee) en maakte een klein programma – voor zijn eigen gebruik – om door tekstbestanden te zoeken. Zijn afdelingshoofd bij Bell Labs, Doug Mcilroy, benaderde Thompson en beschreef het probleem waarmee een van zijn collega’s, Lee McMahon, werd geconfronteerd.
McMahon probeerde de auteurs van de Federalist papers te identificeren door middel van tekstuele analyse. Hij had een tool nodig die kon zoeken naar zinnen en strings in tekstbestanden. Thompson besteedde die avond ongeveer een uur aan het maken van zijn gereedschap tot een algemeen hulpprogramma dat door anderen kon worden gebruikt, en hernoemde het tot grep. Hij nam de naam van de ed opdrachtreeks g/re/p , wat zich vertaalt als ‘globaal zoeken in reguliere expressies’.
Je kunt Thompson zien praten met Brian Kernighan over de geboorte van grep.
Eenvoudige zoekopdrachten met grep
Om een tekenreeks in een bestand te zoeken, geeft u de zoekterm en de bestandsnaam op de opdrachtregel door:
Overeenkomende lijnen worden weergegeven. In dit geval is het een enkele regel. De overeenkomende tekst wordt gemarkeerd. Dit komt omdat bij de meeste distributies grep is gealiast aan:
alias grep='grep --colour=auto'
Laten we eens kijken naar de resultaten waarbij meerdere regels overeenkomen. We zoeken het woord “Gemiddeld” in een toepassingslogbestand. Omdat we ons niet kunnen herinneren of het woord in kleine letters in het logbestand staat, gebruiken we de -i (hoofdlettergebruik negeren) optie:
grep -i Average geek-1.log

Elke overeenkomende regel wordt weergegeven, met de overeenkomende tekst in elke regel gemarkeerd.

We kunnen de niet-overeenkomende regels weergeven door de optie -v (omkeren) te gebruiken.
grep -v Mem geek-1.log

Er is geen accentuering omdat dit de niet-overeenkomende regels zijn.

We kunnen veroorzaken grep om helemaal stil te zijn. Het resultaat wordt aan de shell doorgegeven als een retourwaarde van grep. Een resultaat van nul betekent de string was gevonden, en een resultaat van één betekent het was niet gevonden. We kunnen de retourcode controleren met de $? speciale parameters:
grep -q average geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?

Recursieve zoekopdrachten met grep
Gebruik de optie -r (recursief) om door geneste mappen en submappen te zoeken. Merk op dat u geen bestandsnaam opgeeft op de opdrachtregel, u moet een pad opgeven. Hier zoeken we in de huidige directory “.” en eventuele submappen:
grep -r -i memfree .

De uitvoer bevat de directory en bestandsnaam van elke overeenkomende regel.

We kunnen maken grep volg symbolische links met behulp van de -R (recursieve dereferentie) optie. We hebben een symbolische link in deze map, genaamd logs-folder. Het wijst naar /home/dave/logs.
ls -l logs-folder

Laten we onze laatste zoekopdracht herhalen met de -R (recursieve dereferentie) optie:
grep -R -i memfree .

De symbolische link wordt gevolgd en de directory waarnaar deze verwijst, wordt doorzocht grep te.

Zoeken naar hele woorden
Standaard, grep komt overeen met een regel als het zoekdoel ergens op die regel voorkomt, ook in een andere string. Kijk naar dit voorbeeld. We gaan op zoek naar het woord ‘gratis’.
grep -i free geek-1.log

De resultaten zijn regels met de string “gratis”, maar het zijn geen aparte woorden. Ze maken deel uit van de tekenreeks “MemFree.”

Te dwingen grep om alleen afzonderlijke “woorden” te vinden, gebruikt u de -w (word regexp) optie.
grep -w -i free geek-1.log
echo $?

Dit keer zijn er geen resultaten omdat de zoekterm “gratis” niet als een apart woord in het bestand voorkomt.
Meerdere zoektermen gebruiken
De -E (uitgebreide regexp) optie stelt u in staat om naar meerdere woorden te zoeken. (De -E optie vervangt het verouderde egrep versie van grep.)
Deze opdracht zoekt naar twee zoektermen, ‘gemiddeld’ en ‘memfree’.
grep -E -w -i "average|memfree" geek-1.log

Alle overeenkomende regels worden weergegeven voor elk van de zoektermen.

U kunt ook zoeken naar meerdere termen die niet noodzakelijk hele woorden zijn, maar het kunnen ook hele woorden zijn.
De -e (patronen) optie stelt u in staat om meerdere zoektermen op de opdrachtregel te gebruiken. We maken gebruik van de functie voor reguliere expressies om een zoekpatroon te creëren. Het zegt grep om een van de tekens tussen de haakjes te matchen “[]. ” Dit betekent grep komt overeen met “kB” of “KB” tijdens het zoeken.
![grep -e MemFree -e [kK]B geek-1.log in een terminalvenster](https://www.howtogeek.com/wp-content/uploads/2020/01/15-2.png)
Beide strings komen overeen, en in feite bevatten sommige regels beide strings.
Overeenkomende lijnen precies
De -x (line regexp) komt alleen overeen met regels waar de hele lijn komt overeen met de zoekterm. Laten we zoeken naar een datum- en tijdstempel waarvan we weten dat deze maar één keer in het logbestand voorkomt:
grep -x "20-Jan--06 15:24:35" geek-1.log

De enkele regel die overeenkomt, wordt gevonden en weergegeven.
Het tegenovergestelde daarvan toont alleen de lijnen dat niet doen wedstrijd. Dit kan handig zijn als u naar configuratiebestanden kijkt. Reacties zijn geweldig, maar soms is het moeilijk om de daadwerkelijke instellingen tussen alle te vinden. Hier is de /etc/sudoers het dossier:

We kunnen de commentaarregels als volgt effectief filteren:
sudo grep -v "https://www.howtogeek.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers

Dat is veel gemakkelijker te ontleden.
Alleen overeenkomende tekst weergeven
Het kan voorkomen dat u niet de hele overeenkomende regel wilt zien, alleen de overeenkomende tekst. De -o (alleen bijpassende) optie doet precies dat.
grep -o MemFree geek-1.log

De weergave wordt teruggebracht tot het tonen van alleen de tekst die overeenkomt met de zoekterm, in plaats van de hele overeenkomende regel.

Tellen met grep
grep gaat niet alleen over tekst, het kan ook numerieke informatie leveren. We kunnen maken grep tellen voor ons op verschillende manieren. Als we willen weten hoe vaak een zoekterm in een bestand voorkomt, kunnen we de -c (tel) optie.
grep -c average geek-1.log

grep meldt dat de zoekterm 240 keer in dit bestand voorkomt.
U kunt maken grep toon het regelnummer voor elke overeenkomende regel met de -n (regelnummer) optie.
grep -n Jan geek-1.log

Het regelnummer voor elke overeenkomende regel wordt aan het begin van de regel weergegeven.

Gebruik de knop om het aantal weergegeven resultaten te verminderen -m (max aantal) optie. We gaan de uitvoer beperken tot vijf overeenkomende regels:
grep -m5 -n Jan geek-1.log

Context toevoegen
Het is vaak handig om voor elke overeenkomende regel enkele extra regels te kunnen zien – mogelijk niet-overeenkomende regels. het kan helpen onderscheiden in welke van de overeenkomende regels u geïnteresseerd bent.
Gebruik de optie -A (na context) om enkele regels na de overeenkomende regel weer te geven. In dit voorbeeld vragen we om drie regels:
grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

Om enkele regels van vóór de overeenkomende regel te zien, gebruikt u de -B (context ervoor) optie.
grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

En om regels van voor en na de overeenkomende regel op te nemen, gebruikt u de -C (context) optie.
grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

Overeenkomende bestanden weergeven
Om de namen te zien van de bestanden die de zoekterm bevatten, gebruikt u de -l (bestanden met match) optie. Als u wilt weten welke C-broncodebestanden verwijzingen bevatten naar het sl.h header-bestand, gebruik dan deze opdracht:
grep -l "sl.h" *.c

De bestandsnamen worden vermeld, niet de overeenkomende regels.

En natuurlijk kunnen we zoeken naar bestanden die de zoekterm niet bevatten. De -L (bestanden zonder match) optie doet precies dat.
grep -L "sl.h" *.c

Begin en einde van regels
We kunnen forceren grep om alleen overeenkomsten weer te geven die aan het begin of het einde van een regel staan. De operator voor reguliere expressies komt overeen met het begin van een regel. Vrijwel alle regels in het logbestand bevatten spaties, maar we gaan zoeken naar regels die een spatie als eerste teken hebben:
grep "^ " geek-1.log

De regels met een spatie als eerste teken – aan het begin van de regel – worden weergegeven.

Gebruik de operator voor reguliere expressies om het einde van de regel af te stemmen. We gaan zoeken naar regels die eindigen op ’00’.
grep "00$" geek-1.log

Het display toont de regels met “00” als hun laatste karakters.

Pipes gebruiken met grep
U kunt de invoer natuurlijk naar grep , pijp de uitvoer van grep in een ander programma en hebben grep genesteld in het midden van een pijpketting.
Laten we zeggen dat we alle exemplaren van de tekenreeks “ExtractParameters” in onze C-broncodebestanden willen zien. We weten dat er nogal wat zullen zijn, dus we sturen de uitvoer naar less:
grep "ExtractParameters" *.c | less

De output wordt gepresenteerd in less.

Hiermee kunt u door de lijst met bestanden bladeren en deze gebruiken less's zoekfunctie.
Als we de output van grep in wc en gebruik de -l (regels) optie, kunnen we het aantal regels tellen in de broncodebestanden die “ExtractParameters” bevatten. (We zouden dit kunnen bereiken met de grep -c (tel) optie, maar dit is een nette manier om de leiding naar buiten te demonstreren grep.)
grep "ExtractParameters" *.c | wc -l

Met de volgende opdracht leiden we de uitvoer van ls in grep en leidingen voor de output van grep in sort . We geven een lijst van de bestanden in de huidige directory, selecteren de bestanden met de tekenreeks “Aug” erin en sorteren ze op bestandsgrootte:
ls -l | grep "Aug" | sort +4n

Laten we dat opsplitsen:
-
ls -l: Maak een lange lijst met bestanden met
ls. -
grep “aug”: Selecteer de regels uit het
lsvermelding met “aug” in hen. Merk op dat dit ook bestanden zou vinden met “Aug” in hun naam. - sorteer + 4n: Sorteer de uitvoer van grep in de vierde kolom (bestandsgrootte).
We krijgen een gesorteerde lijst van alle bestanden die in augustus zijn gewijzigd (ongeacht het jaar), in oplopende volgorde van bestandsgrootte.
VERWANT: Pipes gebruiken op Linux
grep: Minder een commando, meer een bondgenoot
grep is een geweldig hulpmiddel om tot je beschikking te hebben. Het dateert uit 1974 en gaat nog steeds goed, omdat we nodig hebben wat het doet, en niets doet het beter.
Koppelen grep met enkele reguliere expressies tilt fu het echt naar een hoger niveau.
VERWANT: Hoe u standaard reguliere expressies gebruikt om beter te zoeken en tijd te besparen

![Uitvoer van grep -e MemFree -e [kK]B geek-1.log in een terminalvenster](https://www.howtogeek.com/wp-content/uploads/2020/01/x16-2.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.dRRlrh5QL-.png)