brainbaking/content/wiki/unix/cmd/grep.md

2.0 KiB

+++ title = "grep" draft = false tags = [ "unix", "cmd", "grep" ] date = "2013-03-12" +++

Greppin' away

Combinatievoorbeeld met find te vinden op [unix/cmd]({{< relref "wiki/unix/cmd.md" >}}).

Surrounding lines while greppin'

Dit heet lines in context in man grep.

grep -B 3 -A 2 foo README.txt

Verklaring: Zoek foo in readme.txt met 3 lijnen boven en 2 lijnen onderaan.

Indien aantal lijnen gelijk, gebruik simpelweg -C [x].

Inverse grepping

In file contents

Om te zoeken naar bijvoorbeeld 'hond', maar niet 'kat', moet je inverse zoeken voor kat:

cat file | grep 'hond' | grep -v 'kat'

Finding pattern a OR b

Combineren gaat met het pipe character (escaped) <br/>| - voorbeeld zoekt naar hond of kat:

cat file | grep 'hond<br/>|kat'

Normale manier is egrep pattern1|pattern2 gebruiken of grep -E pattern1|pattern2.

Toon meer info bij context

grep 'zoekstring' file.bla -n -H 

Print ook line numbers & filename, vooral handig wanneer dit van een -exec commando komt van een search, bijvoorbeeld:

find . -name "*.php" -exec grep 'backlink' {} -C 2 -n -H <br/>; > find_backlinks.txt
  1. Zoek alle .php files vanaf de current directory
  2. Zoek in alle gevonden files naar 'backlink'
  3. Print 2 bovenste en onderste context lijnen af
  4. Print lijn nummer en prefix met bestandsnaam
  5. Output alles naar find_backlinks.txt

De -print flag bij find print de filename af voor elke gevonden file die naar de -exec doorgegeven wordt.

Onder Solaris een commando uitvoeren met -exec moet dit ook nog gewrapped worden met een shell executable, zo:

find . -name "*.php" -exec sh -c 'grep -n "backlink" $1' {} {}<br/>; -print

Vergeet niet dat grep ook andere argumenten (of volgorde) heeft (eerst flags dan search pattern en file, geen -C option etc)!

Zie http://www.compuspec.net/reference/os/solaris/find/find_and_execute_with_pipe.shtml