grep

Tekenreeksen zoeken in tekstbestanden met grep met reguliere expressie

Tekenreeksen zoeken in tekstbestanden met grep met reguliere expressie
grep is een van de meest populaire tools voor het zoeken en vinden van strings in een tekstbestand. De naam 'grep' is afgeleid van een commando in de nu verouderde Unix ed line editor tool - het ed commando voor zoeken wereldwijd via een bestand voor a reguliere expressie en dan afdrukken die regels waren g/re/p, waarbij re de reguliere expressie was die je zou gebruiken. Uiteindelijk is het grep-commando geschreven om deze zoekopdracht in een bestand uit te voeren wanneer ed . niet wordt gebruikt.

In dit artikel laten we u zien hoe u vooraf zoeken op tekenreeksen kunt uitvoeren met Grep met reguliere expressie door u 10 praktische voorbeelden te geven van de implementaties ervan. Veel voorbeelden die in dit artikel worden besproken, hebben praktische implicaties, wat betekent dat je ze kunt gebruiken in je dagelijkse Linux-programmering. De volgende voorbeelden beschrijven enkele regexp-voorbeelden voor vaak gezochte patronen.

Voorbeeld 1: Zoek een enkele bevrachter in een tekstbestand

Om regels in het bestand 'book' uit te voeren die een '$'-teken bevatten, typt u:

$ grep '\$' boek

Voorbeeld 2: Zoek een enkele tekenreeks in een tekstbestand

Om regels uit te voeren in het bestand 'book' dat de string '$14' bevat.99', typ:

$ grep '\$14\.99' boek

Voorbeeld 3: Zoek een enkele speciale bevrachter in een tekstbestand

Om regels in het bestand 'book' uit te voeren die het teken '\' bevatten, typt u:

$ grep '\\' boek

Voorbeeld 4: Overeenkomende regels die beginnen met bepaalde tekst

Gebruik 'ˆ' in een regexp om het begin van een regel aan te duiden.

Om alle regels in '/usr/dict/words' die beginnen met 'pro' uit te voeren, typt u:

$ grep 'ˆpro' /usr/dict/words

Om alle regels in het bestand 'boek' uit te voeren die beginnen met de tekst 'in het begin', ongeacht hoofdletters, typt u:

$ grep -i 'ˆin het begin' boek

OPMERKING: Deze regexps werden geciteerd met 'karakters; dit komt omdat sommige shells het 'ˆ'-teken anders behandelen als een speciaal "metateken"

Naast zoeken op woorden en woordgroepen, kunt u grep gebruiken om te zoeken naar complexe tekstpatronen die reguliere expressies worden genoemd. Een reguliere expressie - of "regexp" - is een tekstreeks van speciale tekens die a . specificeert set van patronen die bij elkaar passen.

Technisch gesproken zijn de woord- of zinspatronen reguliere expressies, gewoon heel eenvoudige. In een reguliere expressie vertegenwoordigen de meeste tekens, inclusief letters en cijfers, zichzelf. Bijvoorbeeld het regexp-patroon 1 komt overeen met de tekenreeks '1' en het patroon jongen komt overeen met de tekenreeks 'jongen'.

Er zijn een aantal gereserveerde tekens, metatekens genaamd, die zichzelf niet vertegenwoordigen in een reguliere expressie, maar ze hebben een speciale betekenis die wordt gebruikt om complexe patronen te bouwen. Deze metakarakters zijn als volgt: ., *, [, ], ˆ, $, en \. Het is goed om op te merken dat dergelijke metatekens veel voorkomen in bijna alle gewone en speciale Linux-distributies. Hier is een goed artikel dat speciale betekenissen van de metatekens behandelt en voorbeelden geeft van hun gebruik.

Voorbeeld 5: Overeenkomende regels die eindigen met bepaalde tekst

Gebruik '$' als het laatste teken van geciteerde tekst om alleen aan het einde van een regel met die tekst overeen te komen. Om regels in het bestand 'gaand' uit te voeren die eindigen op een uitroepteken, typt u:

$ grep'!$' gaat

Voorbeeld 6: Passende lijnen van een bepaalde lengte

Om lijnen van een bepaalde lengte te matchen, gebruikt u dat aantal '.' tekens tussen 'ˆ' en '$'- om bijvoorbeeld alle regels te matchen die twee tekens (of kolommen) breed zijn, gebruikt u 'ˆ… $' als de regexp om te zoeken naar.

Om alle regels in '/usr/dict/words' uit te voeren die precies drie tekens breed zijn, typt u:

$ grep 'ˆ… $' /usr/dict/words

Voor langere regels is het handiger om een ​​andere constructie te gebruiken: 'ˆ.\nummer\$', waarbij nummer het aantal regels is dat overeenkomt. Gebruik ',' om een ​​reeks getallen op te geven.

Om alle regels in '/usr/dict/words' uit te voeren die precies twaalf tekens breed zijn, typt u:

$ grep 'ˆ.\12\$' /usr/dict/words

Om alle regels in '/usr/dict/words' uit te voeren die tweeëntwintig of meer tekens breed zijn, typt u:

$ grep 'ˆ.\22,\$' /usr/dict/words

Voorbeeld 7: overeenkomende regels die een of meer Regexp's bevatten

Om regels te matchen die een aantal regexp's bevatten, specificeert u elk van de regexps waarnaar moet worden gezocht tussen alternatie-operatoren ('\|') als de regexp waarnaar moet worden gezocht. Regels die een van de gegeven regexps bevatten, worden uitgevoerd.

Om alle regels in 'playboy' uit te voeren die ofwel de patronen 'het boek' of 'cake' bevatten, typt u:

$ grep 'het boek\|cake' playboy

Voorbeeld 8: overeenkomende regels die alle Regexp's bevatten

Om lijnen uit te voeren die overeenkomen: alle van een aantal regexps, gebruik grep om regels uit te voeren die de eerste regexp bevatten die je wilt matchen, en pijp de output naar een grep met de tweede regexp als argument. Ga door met het toevoegen van pijpen aan grep-zoekopdrachten voor alle regexps waarnaar je wilt zoeken.

Om alle regels in 'playlist' uit te voeren die zowel patronen 'the shore' als 'sky' bevatten, ongeacht de hoofdletters, typt u:

$ grep -i 'de kust' afspeellijst | grep -i sky

Vb 9: Overeenkomende regels die alleen bepaalde tekens bevatten

Om regels te matchen die alleen bepaalde karakters bevatten, gebruikt u de regexp 'ˆ[karakters]*$', waarbij de karakters degene zijn die overeenkomen.  Om regels in '/usr/dict/words' uit te voeren die alleen klinkers bevatten, typt u:

$ grep -i 'ˆ[aeiou]*$' /usr/dict/words

De optie '-i' komt overeen met tekens, ongeacht de hoofdletters; dus in dit voorbeeld komen alle klinkertekens overeen, ongeacht hoofdletters.

Voorbeeld 10: Zinnen vinden ongeacht de afstand Spa

Een manier om te zoeken naar een zin die kan voorkomen met extra spaties tussen woorden, of over een regel of pagina-einde, is om alle linefeeds en extra spaties uit de invoer te verwijderen en dat vervolgens te grep. Om dit te doen, pipet u de invoer naar tr met "\r\n:\>\|-" als argument voor de '-d' optie (waarbij alle regeleinden uit de invoer worden verwijderd); pijp dat naar het fmt-filter met de '-u'-optie (de tekst wordt met uniforme spatiëring uitgevoerd); en pijp dat om te grijpen naar het patroon om naar te zoeken.

Om over regeleinden heen te zoeken naar de tekenreeks 'op hetzelfde moment als' in het bestand 'docs', typt u:

$ kattendocumenten | tr -d '\r\n:\>\|
-' | fmt -u | grep 'tegelijkertijd met'

Samenvatting

In dit artikel hebben we 10 praktische voorbeelden besproken van het gebruik van de Grep Linux-opdracht voor het zoeken en vinden van strings in een tekstbestand text. Onderweg leerden we hoe we reguliere expressies kunnen gebruiken in combinatie met Grep om complexe zoekopdrachten op tekstbestanden uit te voeren. Inmiddels heb je een beter idee van hoe krachtig de zoekfuncties van Linux zijn.

Hier zijn aanvullende bronnen voor diegenen die meer willen weten over Linux-programmering:

Bronnen voor systeembeheerders

Bronnen voor Linux-kernelprogrammeurs

Woordenboek van Linux-bestandssysteem

Uitgebreid overzicht van hoe Linux-bestands- en directorysysteem werkt

Hoe de muis- en touchpad-instellingen te wijzigen met Xinput in Linux
De meeste Linux-distributies worden standaard geleverd met de bibliotheek "libinput" om invoergebeurtenissen op een systeem af te handelen. Het kan in...
Wijs uw muisknoppen anders toe voor verschillende software met X-Mouse Button Control
Misschien heeft u een tool nodig waarmee u de bediening van uw muis kunt veranderen bij elke applicatie die u gebruikt. Als dit het geval is, kunt u e...
Microsoft Sculpt Touch draadloze muis Review
Ik las onlangs over de Microsoft Sculpt Touch draadloze muis en besloot hem te kopen. Nadat ik het een tijdje had gebruikt, besloot ik mijn ervaring e...