grepAan de slag met grep


Opmerkingen

grep drukt lijnen af die een overeenkomst bevatten voor een patroon in bestanden.

grep kan reguliere expressies gebruiken en heeft verschillende opties om de kwaliteit van de resultaten te verbeteren.

Referenties

versies

POSIX grep

Versie Publicatiedatum
POSIX.2 1992-01-01
IEEE Std 1003.1-2001 2001/12/06
IEEE Std 1003.1, 2004-editie 2004-01-01
IEEE Std 1003.1, 2013-editie 2013/04/19
IEEE Std 1003.1, 2016-editie 2016/09/30

Illumos / OpenSolaris grep

Versie Publicatiedatum
2005-06-14 2005-06-14
2005-09-06 2005-09-06
2012-03-30 2012-03-30
2012-09-17 2012-09-17
2013/05/14 2013/05/14

GNU grep

Versie Publicatiedatum
2.0 1996/10/01
2.2 1998/04/27
2.3 1999/02/14
2.4.1 2000-03-01
2.4.2 2000/03/09
2.4 1999/12/03
2.5.1 2004-10-29
2.5.1a 2004-11-19
2.5.3 2007-08-02
2.5.4 2009-02-09
2.5 2002/03/13
2.6.1 2010-03-25
2.6.2 2010-03-29
2.6.3 2010-04-02
2.6 2010-03-23
2.7 2010-09-20
2.8 2011-05-13
2.9 2011-06-21
2.10 2011-11-16
2.11 2012-03-02
2.12 2012-04-23
2.13 2012-07-04
2.14 2012-08-20
2.15 2013/10/26
2.16 2014/01/01
2.17 2014/02/17
2.18 2014/02/20
2.19 2014/05/22
2.20 2014/06/03
2.21 2014/11/23
2.22 2015/11/01
2.23 2016/02/04
2.24 2016/03/10
2.25 2016/04/21
2.26 2016/10/02
2.27 2016/12/06
2.28 2017/02/06

BSD grep / FreeGrep

Versie Publicatiedatum
OpenBSD 3.0 2001-12-01
OpenBSD 3.4 2003-11-01
OpenBSD 3.5 2004-05-01
OpenBSD 3.6 2004-11-01
OpenBSD 3.7 2005-05-19
OpenBSD 3.8 2005-11-01
OpenBSD 3.9 2006-05-01
OpenBSD 4.0 2006-11-01
OpenBSD 4.1 2007-05-01
OpenBSD 4.3 2008-05-01
OpenBSD 4.8 2010-11-01
OpenBSD 5.0 2011-11-01
OpenBSD 5.3 2013/05/01
OpenBSD 5.7 2015/05/01
OpenBSD 5.8 2015/10/18
OpenBSD 5.9 2016/03/29
NetBSD 2.0 2004-12-09
NetBSD 4.0 2007-12-19
NetBSD 6.0 2012-10-17
NetBSD 7.0 2015/09/25
FreeBSD 9.0 2012-01-02
FreeBSD 10.0 2014/01/16

Basis gebruik

De opdracht uitvoeren:

grep sam someFile.txt
 

Wanneer someFile.txt bevat:

fred 14 m foo
sam 68 m bar
christina 83 f baz
bob 22 m qux
Sam 41 m quux
 

Zal deze output produceren:

sam 68 m bar
 

Zoek recursief naar tekst in een bepaalde map

GNU grep gebruiken

grep -r 'pattern' <directory path>
 

Gebruik de optie -n om ook regelnummers van overeenkomsten weer te geven

grep -rn 'pattern' <directory path>
 

Om alleen bestanden te zoeken met een specifiek glob- patroon

grep --include='*.txt' -r 'pattern' <directory path>
 

Sluit bestandspatronen of mappen uit

grep -R --exclude=*.log 'pattern' <directory path>
grep -R --exclude={*.log,*.class} 'pattern' <directory path>

grep -R --exclude-dir=tmp 'pattern' <directory path>
grep -R --exclude-dir={tmp,lib} 'pattern' <directory path>
 

Notities en andere handige opties

  • <directory path> kan worden overgeslagen als in de huidige map wordt gezocht
  • De opties -R volgen alle symbolische koppelingen, in tegenstelling tot -r die alleen symbolische koppelingen volgt als deze zich op de opdrachtregel bevinden
  • -l om alleen overeenkomende bestanden weer te geven
  • -h om het voorvoegsel van de bestandsnaam te onderdrukken
  • --color=auto om overeenkomende patronen te markeren
  • -m <num> om het maximale aantal overeenkomsten voor elke bestandsinvoer op te geven

POSIX-oplossing om recursief te zoeken

find <directory path> -type f -exec grep -l 'pattern' {} +
 
  • Opties zoals -n , -l , enz. Kunnen indien nodig worden gebruikt
  • Als {} + niet wordt ondersteund, gebruikt u {} \; in plaats daarvan
  • Zie vondst documentatie voor meer hulp bij het find commando zoals hoe include / exclude bestandstypen, directories etc

Grep contextcontrole

Gegeven een voorbeeldbestand genaamd filmlijst.

Troy
Gladiator
Robin Hood
King Arthur
BraveHeart
The Last Samurai
 

Normale grep keert terug

grep "Gladiator" movieslist
Gladiator
 

Gebruik nu grep om de onder- of bovenregels van het bestand af te drukken.

Om de onderstaande regel af te drukken

grep -A 1 Gladiator movieslist 
Gladiator
Robin Hood
 

Om de bovenstaande regel af te drukken

grep -B 1 Gladiator movieslist 
Troy
Gladiator
 

Om beide af te drukken

grep -C 1 Gladiator movieslist 
Troy
Gladiator
Robin Hood
 

Negeer zaak

Gegeven een sample :

hello
Hello
HELLO_there
 

Een normale grep voor "hallo" retourneert:

$ grep "hello" sample 
hello
 

Het gebruik van -i maakt het mogelijk om hoofdletters en kleine letters te negeren:

$ grep -i "hello" sample
hello
Hello
HELLO_there
 

Overeenkomen met hele woorden

Gegeven een sample :

hello world
ahello here
hello_there
 

Een normale grep voor "hallo" retourneert:

$ grep hello sample 
hello world
ahello here
hello_there
 

Met -w kunt u die regels selecteren die overeenkomsten bevatten die hele woorden vormen:

$ grep -w hello sample 
hello world
 

Drukt alleen het overeenkomende deel van de lijnen af

echo "Prints only the matching part of the lines" | grep -o "matching"
# prints matching