De naam greep komt van het ed (en vim)-commando g/re/p, wat betekent globaal zoeken naar een bepaalde reguliere expressie en de uitvoer afdrukken (weergeven).
Normaal 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 greep kan worden gebruikt om eenvoudige tekst in een bepaald bestand of bestanden te vinden. Om de voorbeelden te proberen, maakt u eerst het voorbeeldbestand.
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
xz
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 commando's worden getypt om ze goed te leren.
Bekijk het voorbeeldbestand voordat u de voorbeelden probeert:
$katmijn bestand
Eenvoudig zoeken
Voer het volgende uit om de tekst 'xyz' in het bestand te vinden:
$greepxyz mijnbestandKleuren gebruiken
Om kleuren weer te geven, gebruikt u –color (een dubbel koppelteken) of maakt u eenvoudig een alias aan. Bijvoorbeeld:
$greep --kleurxyz mijnbestandof
$alias greep= ’greep--kleur'$greepxyz mijnbestand
Opties
Veelgebruikte opties met de greep commando omvatten:
- -ik vind alle lijnen ongeacht van geval
- -C Graaf hoeveel regels bevatten de tekst
- -n weergaveregel nummers van overeenkomende lijnen
- -Ik geef alleen weer het dossier namen die wedstrijd
- -R recursief zoeken in submappen
- -v vind alle regels NIET met de tekst
Bijvoorbeeld:
$greep -lxyz mijnbestand# zoek tekst ongeacht hoofdletter$greep -icxyz mijnbestand# tel regels met tekst
$greep -inxyz mijnbestand# toon regelnummers
Meerdere bestanden maken
Voordat u meerdere bestanden probeert te doorzoeken, moet u eerst een aantal nieuwe bestanden maken:
$gooide uitxyz>mijnbestand1$gooide uit -Enxyz xzz XYZ>mijnbestand2
$gooide uit -Enxxx yyy>mijnbestand3
$katmijnbestand1
$katmijnbestand2
$katmijnbestand3
Zoeken in meerdere bestanden
Om meerdere bestanden te doorzoeken met bestandsnamen of een jokerteken, voert u het volgende in:
$greep -icxyz mijnbestand mijnbestand1 mijnbestand2 mijnbestand3$greep -inxyz mijn*
# match bestandsnamen die beginnen met 'mijn'
Oefening I
- Tel eerst hoeveel regels er in het bestand /etc/passwd staan.
- Zoek nu alle exemplaren van de tekst waar in het bestand /etc/passwd .
- Zoek uit hoeveel regels in het bestand de tekst bevatten
- Zoek uit hoeveel regels de tekst NIET bevatten waar .
- Zoek het item voor uw login in de /etc/passwd
Oefenoplossingen vindt u aan het einde van dit artikel.
Reguliere expressies gebruiken
Het bevel greep 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: greep , ik kwam 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 nieuwe regel) |
* | 0 of meer van de vorige uitdrukking |
Als een symbool voorafgaat, wordt het een letterlijk teken |
Merk op dat de *, die op de opdrachtregel kan worden gebruikt om een willekeurig aantal tekens te matchen, 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 met tekst beginnen met het ^-teken:
$greep'^xyz' mijnbestandOm alle regels te vinden die eindigen op tekst met behulp van het $-teken:
$greep'xyz$' mijnbestandRegels zoeken die een tekenreeks bevatten met zowel ^- als $-tekens:
$greep'^xyz$' mijnbestandOm lijnen te vinden met de . om een willekeurig teken te matchen:
$greep'^x.z' mijnbestandRegels zoeken met de * die overeenkomen met 0 of meer van de vorige uitdrukking:
$greep'^xy*z 'mijnbestand'Regels zoeken met .* die overeenkomen met 0 of meer van een willekeurig teken:
$greep‘^X.*z 'mijnbestand'Om lijnen te vinden met de om te ontsnappen aan het * teken:
$greep'^ X *z 'mijnbestand'Gebruik om het teken te vinden:
$greep'\' mijn bestandUitdrukking grep – egrep
De greep opdracht ondersteunt slechts een subset van de beschikbare reguliere expressies. Echter, de opdracht egrep:
- maakt het volledige gebruik van alle reguliere expressies mogelijk
- kan tegelijkertijd naar meer dan één uitdrukking zoeken
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 --kleur'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 |
Dit extraheert de regels die beginnen met root, uucp of mail uit het bestand, de | symbool dat een van de opties betekent.
Het volgende commando zal niet werken, hoewel er geen bericht wordt weergegeven, omdat de basis greep commando ondersteunt niet alle reguliere expressies:
$greep '(^root|^uucp|^mail)' /enzovoort/passwdOp de meeste Linux-systemen is het commando grep -E is hetzelfde als het gebruik van egrep :
$greep -EN '(^root|^uucp|^mail)' /enzovoort/passwdFilters 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 de standaarduitvoer wordt verzonden.
In het volgende voorbeeld wordt standaarduitvoer van ls -l wordt als standaardinvoer doorgegeven aan de greep opdracht. Uitvoer van de greep commando wordt dan als invoer doorgegeven aan de meer opdracht.
Hierdoor worden alleen mappen weergegeven in /enzovoort :
$ls -de /enzovoort|greep'^d'|meerDe volgende opdrachten zijn voorbeelden van het gebruik van filters:
$ps -ef|greepcron $WHO|greepkdmVoorbeeldbestand
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:
Persoonlijke J.Smith 25000Persoonlijke E.Smith 25400
Training A.Brown 27500
Opleiding C.Browen 23400
(Beheerder) R.Bron 30500
Goodsout T.Smyth 30000
Persoonlijke F.Jones 25000
opleiding* C.Evans 25500
Goodsout W.Paus 30400
Begane grond T.Smythe 30500
Personeel J.Maler 33000
Oefening II
- Toon het bestand mensen en de inhoud ervan onderzoeken.
- Zoek alle regels die de string bevatten Smit in het bestand people.Hint: gebruik het commando grep maar onthoud dat het standaard hoofdlettergevoelig is.
- Maak een nieuw bestand, npeople, met alle regels die beginnen met de tekenreeks persoonlijk in het people-bestand. Hint: gebruik het commando grep met >.
- Bevestig de inhoud van het bestand npeople door het bestand op te sommen.
- Voeg nu alle regels toe waar de tekst eindigt met de string 500 in het bestand people naar het bestand npeople.Hint: gebruik het commando grep met >>.
- Bevestig nogmaals de inhoud van het bestand npeople door het bestand op te sommen.
- Zoek het IP-adres van de server die in het bestand is opgeslagen /etc/hosts .Hint: gebruik het commando grep met $(hostname)
- Gebruik maken van 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 haken openen en sluiten [ ], de backslash , het caret ^, het dollarteken $, de punt of punt ., het verticale balk- of pijpsymbool |, het vraagteken ?, de asterisk of ster *, het plusteken + en het ronde haakje openen en sluiten { }. Deze speciale karakters worden ook vaak metakarakters genoemd.
Hier is de volledige set speciale tekens:
^ | Begin van een regel |
$ | Einde van een regel |
. | Elk teken (behalve 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 greep 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 uitdrukkingen aan te passen:
$egrep'xxz|xzz' mijnbestandLijnen zoeken met | om een van beide expressies binnen een string te matchen, gebruik ook ( ):
$egrep‘^ X(Yz|yz)' mijn bestandOm lijnen te vinden met [ ] die overeenkomen met een willekeurig teken:
$egrep‘^ X[yy]z 'mijnbestand'Om lijnen te vinden met [ ] die NIET overeenkomen met een teken:
$egrep‘^ X[^ Ja]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' mijnbestandOm lijnen te vinden met behulp van de ? overeenkomen met 0 of 1 van de vorige uitdrukking:
$egrep'^xy?z' mijnbestandOefening III
- Zoek alle regels met de namen Evans of schilder in het bestand mensen.
- Zoek alle regels met de namen Smith, Smyth of Smythe in het bestand mensen.
- Zoek alle regels met de namen Brown, Brown of Bron in het bestand mensen.Als je tijd hebt:
- Zoek de regel met de string (beheerder), inclusief de haakjes, in het bestand mensen.
- Zoek de regel met het teken * in het bestand mensen.
- 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'^xy{3}z 'mijnbestand'$egrep'^xy{4}z 'mijnbestand'
Regels zoeken met { } die N of meer keer overeenkomen:
$egrep'^xy{3,}z 'mijnbestand'Om lijnen te vinden met { } die overeenkomen met N keer maar niet meer dan M keer:
$egrep'^xy{2,3}z 'mijnbestand'Conclusie
In deze tutorial hebben we eerst gekeken naar het gebruik van greep 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 u de hier opgedane kennis goed kunt gebruiken. Probeer greep commando's op uw eigen gegevens en onthoud dat reguliere expressies zoals hier beschreven in dezelfde vorm kunnen worden gebruikt in wij , 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 waar in het bestand /etc/passwd.
$ grep var /etc/passwd
Zoek uit hoeveel regels in het bestand de tekst bevatten waar
Zoek uit hoeveel regels de tekst NIET bevatten waar .
greep -CVwaar/enzovoort/passwdZoek 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.
$ cat people
Zoek alle regels die de string bevatten Smit in het bestand mensen .
$ grep 'Smith' people
Maak een nieuw bestand, npeople , met alle regels die beginnen met de tekenreeks persoonlijk in de mensen het dossier
$ grep '^Personal' people> npeople
Bevestig de inhoud van het bestand npeople door het bestand op te sommen.
$ cat npeople
Voeg nu alle regels toe waar de tekst eindigt met de string 500 in het bestand mensen naar het bestand npeople .
$ grep '500$' people>>npeople
Bevestig nogmaals de inhoud van het bestand npeople door het bestand op te sommen.
$ cat npeople
Zoek het IP-adres van de server die in het bestand is opgeslagen /etc/hosts .
$ grep $(hostname) /etc/hosts
Gebruik maken van 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 schilder in het bestand mensen .
$ egrep 'Evans|Maler' people
Zoek alle regels met de namen Smit , Smyth of Smythe in het bestand mensen .
$ egrep 'Sm(i|y)the?' people
Zoek alle regels met de namen bruin , browen of Bron in het bestand mensen.
$ egrep 'Brow?e?n' people
Zoek de regel met de string (beheerder), inclusief de haakjes, in het bestand mensen .
Zoek de regel met het teken * in het bestand mensen.
$ egrep '*' people
Combineer 5 en 6 hierboven om beide uitdrukkingen te vinden.