Hoe de grep-opdracht op Linux te gebruiken

Een terminalprompt op een Linux-pc.
Fatmawati Achmad Zaenuri / Shutterstock

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:

grep dave / etc / password in een terminal widnow

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

grep -i Gemiddelde geek-1.log in een terminalvenster

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

Uitvoer van grep -i Gemiddelde geek-1.log in een terminalvenster

We kunnen de niet-overeenkomende regels weergeven door de optie -v (omkeren) te gebruiken.

grep -v Mem geek-1.log

grep -v Mem geek-1.log in een terminalvenster

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

uitvoer van grep -v Mem geek-1.log in een terminalvenster

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 $?

grep -q gemiddelde geek-1.log in een terminalvenster

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 .

grep -r -i memfree.  in een terminalvenster

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

uitvoer van grep -r -i memfree.  in een terminalvenster

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

ls -l logs-map in een terminalvenster

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

grep -R -i memfree .

grep -R -i memfree.  in een terminalvenster

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

Uitvoer van grep -R -i memfree.  in een terminalvenster

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

grep -i gratis geek-1.log in een terminalvenster

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

Uitvoer van grep -i gratis geek-1.log in een terminalvenster

Te dwingen grep om alleen afzonderlijke “woorden” te vinden, gebruikt u de -w (word regexp) optie.

grep -w -i free geek-1.log
echo $?

grep -w -i gratis geek-1.log in een terminalvenster

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

grep -E -w -i "gemiddelde | memfree" geek-1.log in een terminalvenster

Alle overeenkomende regels worden weergegeven voor elk van de zoektermen.

Uitvoer van grep -E -w -i "gemiddelde | memfree" geek-1.log in een terminalvenster

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

Beide strings komen overeen, en in feite bevatten sommige regels beide strings.

Uitvoer van grep -e MemFree -e [kK]B geek-1.log in een terminalvenster

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

grep -x "20-Jan - 06 15:24:35" geek-1.log in een terminalvenster

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:

Inhoud van het bestand / etc / sudoers in een terminalvenster

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

sudo grep -v "#" / etc / sudoers in een terminalvenster

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

grep -o MemFree geek-1.log in een terminalvenster

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

uitvoer van grep -o MemFree geek-1.log in een terminalvenster

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 -c gemiddelde geek-1.log in een terminalvenster

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

grep -n jan geek-1.log in een terminalvenster

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

Uitvoer van grep -n jan geek-1.log in een terminalvenster

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

grep -m5 -n Jan geek-1.log in een terminalvenster

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

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log in een terminalvenster

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

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log in een terminalvenster

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

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log in een terminalvenster

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

grep -l "sl.h" * .c in een terminalvenster

De bestandsnamen worden vermeld, niet de overeenkomende regels.

Uitvoer van grep -l "sl.h" * .c in een terminalvenster

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

grep -L "sl.h" * .c in een terminalvenster

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

grep "^" geek-1.log in een terminalvenster

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

Voer grep "^" geek-1.log uit in een terminalvenster

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

grep "00 $" geek-1.log in een terminalvenster

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

uitvoer van grep "00 $" geek-1.log in een terminalvenster

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

grep "ExtractParameters" * .c |  minder in een terminalvenster

De output wordt gepresenteerd in less.

Uitvoer van grep "ExtractParameters" * .c |  minder in een terminalvenster

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

grep "ExtractParameters" * .c |  wc -l in een terminalvenster

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

ls -l |  grep "aug" |  sort + 4n in een terminalvenster

Laten we dat opsplitsen:

  • ls -l: Maak een lange lijst met bestanden met ls.
  • grep “aug”: Selecteer de regels uit het ls vermelding 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

Nieuwste artikelen

Gerelateerde artikelen