grep

grep (en egrep) gebruiken met reguliere expressies

grep (en egrep) gebruiken met reguliere expressies
In deze zelfstudie wordt beschreven hoe u beide kunt gebruiken grep (en egrep) to tekst vinden in bestanden, in hun eenvoudige vorm en in combinatie met reguliere expressies. Het bevat verschillende voorbeelden en opdrachten, plus oplossingen, voor de kijker om te voltooien.

De naam grep komt van het ed (en vim) commando "g/re/p", wat betekent dat globaal naar een bepaalde reguliere expressie moet worden gezocht en de uitvoer wordt afgedrukt (weergegeven).

regelmatig Uitdrukkingen

Met de hulpprogramma's kan de gebruiker tekstbestanden zoeken naar regels die overeenkomen met een reguliere expressie (regexp). Een reguliere expressie is een zoekreeks die bestaat uit tekst en een of meer van 11 speciale tekens. Een eenvoudig voorbeeld is het matchen van het begin van een regel.

Voorbeeldbestand

De basisvorm van grep kan worden gebruikt om eenvoudige tekst in een bepaald bestand of bestanden te vinden. Om de voorbeelden te proberen, moet u eerst het voorbeeldbestand maken.

Gebruik een editor zoals nano of vim om de onderstaande tekst te kopiëren naar een bestand met de naam mijn bestand.

xyz
xyzde
exyzd
dexyz
d?gxyz
xxz
xzz
x\z
x*z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

Hoewel u de voorbeelden in de tekst mag kopiëren en plakken (houd er rekening mee dat dubbele aanhalingstekens mogelijk niet correct worden gekopieerd), moeten opdrachten worden getypt om ze goed te leren.

Bekijk het voorbeeldbestand voordat u de voorbeelden probeert:

$ kat mijnbestand

Eenvoudig zoeken

Voer het volgende uit om de tekst 'xyz' in het bestand te vinden:

$ grep xyz mijnbestand

Kleuren gebruiken

Gebruik -color (een dubbel koppelteken) om kleuren weer te geven of maak gewoon een alias. Bijvoorbeeld:

$ grep --kleur xyz mijnbestand

of

$ alias grep='grep --color'
$ grep xyz mijnbestand

Opties

Veelgebruikte opties met de with grep commando omvatten:

Bijvoorbeeld:

$ grep -i xyz mijnbestand      # zoek tekst ongeacht hoofdletter
$ grep -ic xyz mijnbestand     # tel regels met tekst
$ grep -in xyz mijnbestand     # regelnummers weergeven

Meerdere bestanden maken

Voordat u meerdere bestanden probeert te doorzoeken, moet u eerst een aantal nieuwe bestanden maken:

$ echo xyz>mijnbestand1
$ echo -e “xyz\nxzz\nXYZ”>mijnbestand2
$ echo -e "xxx\nyyy">mijnbestand3
$ kat mijnbestand1
$ kat mijnbestand2
$ kat mijnbestand3

Zoeken in meerdere bestanden

Om meerdere bestanden te doorzoeken met bestandsnamen of een jokerteken, voert u het volgende in:

$ grep -ic xyz mijnbestand mijnbestand1 mijnbestand2 mijnbestand3
$ grep -in xyz mijn* 
# match bestandsnamen die beginnen met 'mijn'

Oefening I

  1. Tel eerst hoeveel regels er in het bestand /etc/passwd . staan.
Hint: gebruik wc -l /etc/passwd
  1. Zoek nu alle exemplaren van de tekst var in het bestand /etc/passwd.
  2. Zoek uit hoeveel regels in het bestand de tekst bevatten
  3. Zoek uit hoeveel regels de tekst NIET bevatten var.
  4. Zoek het item voor uw login in de /etc/passwd

Oefenoplossingen vindt u aan het einde van dit artikel.

Reguliere expressies gebruiken

Het bevel grep kan ook worden gebruikt met reguliere expressies door een of meer van de elf speciale tekens of symbolen te gebruiken om de zoekopdracht te verfijnen. Een reguliere expressie is een tekenreeks die speciale tekens bevat om patroonovereenkomsten mogelijk te maken binnen hulpprogramma's zoals: grep, vim en sed. Houd er rekening mee dat de tekenreeksen mogelijk tussen aanhalingstekens moeten worden geplaatst.

De beschikbare speciale tekens zijn:

^ Begin van een regel
$ Einde van een regel
. Elk teken (behalve \n nieuwe regel)
* 0 of meer van de vorige uitdrukking
\ Als een symbool voorafgaat, wordt het een letterlijk teken

Houd er rekening mee dat de *, die op de opdrachtregel kan worden gebruikt om overeen te komen met een willekeurig aantal tekens, inclusief geen, is niet hier op dezelfde manier gebruikt.

Let ook op het gebruik van aanhalingstekens in de volgende voorbeelden:.

Voorbeelden

Om alle regels te vinden die beginnen met tekst met het ^-teken:

$ grep '^xyz' mijnbestand

Om alle regels te vinden die eindigen op tekst met behulp van het $-teken:

$ grep 'xyz$' mijnbestand

Om regels te vinden die een string bevatten met zowel ^ als $ tekens:

$ grep '^xyz$' mijnbestand

Om lijnen te vinden met de . om een ​​willekeurig teken te matchen:

$ grep '^x.z' mijnbestand

Regels zoeken met de * die overeenkomen met 0 of meer van de vorige uitdrukking:

$ grep '^xy*z' mijnbestand

Lijnen zoeken met .* om overeen te komen met 0 of meer van een willekeurig teken:

$ grep '^x.*z' mijnbestand

Om lijnen te vinden met de \ om te ontsnappen aan het * teken:

$ grep '^x\*z' mijnbestand

Gebruik om het teken \ te vinden:

$ grep '\\' mijnbestand

Uitdrukking grep - egrep

De grep opdracht ondersteunt slechts een subset van de beschikbare reguliere expressies. Echter, de opdracht egrep:

Merk op dat de uitdrukkingen tussen een paar aanhalingstekens moeten staan.

Om kleuren te gebruiken, gebruik -color of maak opnieuw een alias:

$ alias egrep='egrep --color'

Om naar meer dan één te zoeken regex de egrep opdracht kan over meerdere regels worden geschreven. Dit kan echter ook met deze speciale tekens:

| Afwisseling, het een of het ander
(…) Logische groepering van een deel van een uitdrukking
$ egrep '(^root|^uucp|^mail)' /etc/passwd

Dit extraheert de regels die beginnen met root, uucp of mail uit het bestand, de | symbool betekent een van de opties.

Het volgende commando zal niet werken, hoewel er geen bericht wordt weergegeven, omdat de basis grep commando ondersteunt niet alle reguliere expressies:

$ grep '(^root|^uucp|^mail)' /etc/passwd

Op de meeste Linux-systemen is het commando grep -E is hetzelfde als het gebruik van egrep:

$ grep -E '(^root|^uucp|^mail)' /etc/passwd

Filters gebruiken

Leidingen is het proces van het verzenden van de uitvoer van een opdracht als invoer naar een andere opdracht en is een van de krachtigste Linux-tools die beschikbaar zijn.

Commando's die in een pijplijn verschijnen, worden vaak filters genoemd, omdat ze in veel gevallen de ingevoerde invoer doorzoeken of wijzigen voordat de gewijzigde stream naar standaarduitvoer wordt verzonden.

In het volgende voorbeeld wordt standaarduitvoer van ls -l wordt als standaardinvoer doorgegeven aan de grep opdracht. Uitvoer van de grep commando wordt dan als invoer doorgegeven aan de meer opdracht.

Hierdoor worden alleen mappen weergegeven in /enz:

$ ls -l /etc|grep '^d'|meer

De volgende opdrachten zijn voorbeelden van het gebruik van filters:

$ ps -ef|grep cron

$ wie|grep kdm

Voorbeeldbestand

Om de beoordelingsoefening te proberen, maakt u eerst het volgende voorbeeldbestand:.

Gebruik een editor zoals nano of vim om de onderstaande tekst te kopiëren naar een bestand met de naam mensen:

Persoonlijk       J.Smid       25000
Persoonlijk       E.Smid       25400
Training       A.Bruin       27500
Training       C.Brown      23400
(Beheerder)        R.Bron        30500
Goederenout      T.Smyth       30000
Persoonlijk       F.Jones       25000
training*      C.Evans       25500
Goederenout      W.Paus        30400
Begane grond T.Smythe      30500
Persoonlijk       J.Maler       33000

Oefening II

  1. Toon het bestand mensen en de inhoud ervan onderzoeken.
  2. Zoek alle regels die de string bevatten Smit in het bestand mensen.Hint: gebruik het commando grep, maar onthoud dat het standaard hoofdlettergevoelig is.
  3. Maak een nieuw bestand, npeople, met alle regels die beginnen met de tekenreeks persoonlijk in het personenbestand.Hint: gebruik het commando grep met >.
  4. Bevestig de inhoud van het bestand npeople door het bestand op te sommen.
  5. Voeg nu alle regels toe waar de tekst eindigt met de string 500 in het bestand mensen naar het bestand npeople.Hint: gebruik het commando grep met >>.
  6. Bevestig nogmaals de inhoud van het bestand npeople door het bestand op te sommen.
  7. Zoek het IP-adres van de server die in het bestand is opgeslagen /etc/hosts.Hint: gebruik het commando grep met $(hostname)
  8. Gebruik egrep uit de . halen /etc/passwd bestand accountregels met lp of je eigen gebruikersnaam.

Oefenoplossingen vindt u aan het einde van dit artikel.

Meer reguliere expressies

Een reguliere expressie kan worden gezien als jokertekens op steroïden.

Er zijn elf tekens met een speciale betekenis: de vierkante haakjes openen en sluiten [ ], de backslash \, het caret ^, het dollarteken $, de punt of punt ., het verticale streep- of pijpsymbool |, het vraagteken ?, het sterretje of sterretje *, het plusteken + en het ronde haakje openen en sluiten . Deze speciale tekens worden ook vaak metatekens genoemd.

Hier is de volledige set speciale tekens:

^ Begin van een regel
$ Einde van een regel
. Elk teken (behalve \n nieuwe regel)
* 0 of meer van de vorige uitdrukking
| Afwisseling, het een of het ander
[… ] Expliciete reeks tekens die moeten overeenkomen
+ 1 of meer van de vorige uitdrukking
? 0 of 1 van de vorige uitdrukking
\ Als een symbool voorafgaat, wordt het een letterlijk teken
Expliciete kwantornotatie
(…) Logische groepering van een deel van een uitdrukking

De standaardversie van grep heeft slechts beperkte ondersteuning voor reguliere expressies. Om ervoor te zorgen dat alle volgende voorbeelden werken, gebruikt u egrep in plaats daarvan of grep -E.

Om lijnen te vinden met de | om een ​​van beide expressies te matchen:

$ egrep 'xxz|xzz' mijnbestand

Lijnen zoeken met | om een ​​van beide expressies binnen een string te matchen, gebruik ook ( ):

$ egrep '^x(Yz|yz)' mijnbestand

Om lijnen te vinden met [ ] die overeenkomen met elk teken:

$ egrep '^x[Yy]z' mijnbestand

Om lijnen te vinden met [ ] die NIET overeenkomen met een teken:

$ egrep '^x[^Yy]z' mijnbestand

Regels zoeken met de * die overeenkomen met 0 of meer van de vorige uitdrukking:

$ egrep '^xy*z' mijnbestand

Regels zoeken met de + die overeenkomen met 1 of meer van de vorige uitdrukkingen:

$ egrep '^xy+z' mijnbestand

Om lijnen te vinden met de ? overeenkomen met 0 of 1 van de vorige uitdrukking:

$ egrep '^xy?z' mijnbestand

Oefening III

  1. Zoek alle regels met de namen Evans of Maler in het bestand mensen.
  2. Zoek alle regels met de namen Smith, Smyth of Smythe in het bestand mensen.
  3. Zoek alle regels met de namen Brown, Brown of Bron in het bestand mensen.Als je tijd hebt:
  4. Zoek de regel met de string (beheerder), inclusief de haakjes, in het bestand mensen.
  5. Zoek de regel met het teken * in het bestand mensen.
  6. Combineer 5 en 6 hierboven om beide uitdrukkingen te vinden.

Meer voorbeelden

Lijnen zoeken met . en * om een ​​willekeurige set tekens te matchen:

$ egrep '^xy.*z' mijnbestand

Regels zoeken met die overeenkomen met N aantal tekens:

$ egrep '^xy3z' mijnbestand
$ egrep '^xy4z' mijnbestand

Regels zoeken met die N of vaker overeenkomen:

$ egrep '^xy3,z' mijnbestand

Om lijnen te vinden met die overeenkomen met N keer maar niet meer dan M keer:

$ egrep '^xy2,3z' mijnbestand

Conclusie

In deze tutorial hebben we eerst gekeken naar het gebruik van grep in zijn eenvoudige vorm om tekst in een bestand of in meerdere bestanden te vinden. Vervolgens combineerden we de tekst waarnaar moet worden gezocht met eenvoudige reguliere expressies en vervolgens met complexere met behulp van egrep.

Volgende stappen

Ik hoop dat je de hier opgedane kennis goed kunt gebruiken. Probeer grep commando's op uw eigen gegevens en onthoud dat reguliere expressies zoals hier beschreven in dezelfde vorm kunnen worden gebruikt in vi, sed en awk!

Oefenoplossingen

Oefening I

Tel eerst hoeveel regels er in het bestand staan /etc/passwd.
$ wc -l /etc/passwd
Zoek nu alle exemplaren van de tekst var in het bestand /etc/passwd.
$ grep var /etc/passwd
Zoek uit hoeveel regels in het bestand de tekst bevatten var

grep -c var /etc/passwd

Zoek uit hoeveel regels de tekst NIET bevatten var.

grep -cv var /etc/passwd

Zoek het item voor uw login in de /etc/passwd het dossier
grep kdm /etc/passwd

Oefening II

Toon het bestand mensen en de inhoud ervan onderzoeken.
$ kattenmensen
Zoek alle regels die de string bevatten Smit in het bestand mensen.
$ grep 'Smith' mensen
Een nieuw bestand maken, npeople, met alle regels die beginnen met de tekenreeks persoonlijk in de mensen het dossier
$ grep '^Persoonlijke' mensen> nmensen
Bevestig de inhoud van het bestand npeople door het bestand op te sommen.
$ kat npeople
Voeg nu alle regels toe waar de tekst eindigt met de string 500 in het bestand mensen naar het bestand npeople.
$ grep '500$' mensen>>nmensen
Bevestig nogmaals de inhoud van het bestand npeople door het bestand op te sommen.
$ kat npeople
Zoek het IP-adres van de server die in het bestand is opgeslagen /etc/hosts.
$ grep $(hostnaam) /etc/hosts
Gebruik egrep uit de . halen /etc/passwd bestand accountregels met lp of uw eigen gebruikers-ID.
$ egrep '(lp|kdm :)' /etc/passwd

Oefening III

Zoek alle regels met de namen Evans of Maler in het bestand mensen.
$ egrep 'Evans|Maler' mensen
Zoek alle regels met de namen Smit, Smyth of Smythe in het bestand mensen.
$ egrep 'Sm(i|y)the?' mensen
Zoek alle regels met de namen Bruin, browen of Bron in het bestand mensen.
$ egrep 'Brow'?e?geen mensen
Zoek de regel met de string (beheerder), inclusief de haakjes, in het bestand mensen.

$ egrep '\(Admin\)' mensen

Zoek de regel met het teken * in het bestand mensen.
$ egrep '\*' mensen
Combineer 5 en 6 hierboven om beide uitdrukkingen te vinden.

$ egrep '\(Admin\)|\*' mensen


Emuleer muisklikken door te zweven met Clickless Mouse in Windows 10
Het gebruik van een muis of toetsenbord in de verkeerde houding of overmatig gebruik kan leiden tot veel gezondheidsproblemen, waaronder spanning, car...
Voeg muisbewegingen toe aan Windows 10 met deze gratis tools
In de afgelopen jaren zijn computers en besturingssystemen sterk geëvolueerd. Er was een tijd dat gebruikers opdrachten moesten gebruiken om door best...
Beheer en beheer muisbewegingen tussen meerdere monitoren in Windows 10
Muisbeheer voor twee schermen laat je muisbewegingen tussen meerdere monitoren controleren en configureren door de bewegingen nabij de grens te vertra...