IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)


La comanda grep és una de les comandes més útils i versàtils de Linux. grep mostra només les línies que compleixen amb un patró. La sintaxi és:

$ grep [opcions] regexp [fitxers]

On regexp és una expressió regular. Grep treballa per defecte amb expressions regulars bàsiques però podem indicar que treballi amb expressions regulars extenses amb l'opció -e.

El resultat de l'execució de la comanda és el nom del fitxer que conté el text buscat i la línia que conté aquest text. Per exemple:

$ grep -r "Linux" /
/sbin/wpa_action:# On Debian GNU/Linux systems, the text of the GPL license can be
...
Coincidència en el fitxer binari /sbin/fdisk
...
/sbin/dhclient-script:# dhclient-script for Linux. Dan Halbert, March, 1997.
...

Si us fixeu, veureu que grep busca el text tant en fitxers de text, com a fitxers binaris (per saber de quin tipus és un fitxer utilitzeu la comanda file).

Sí consulteu el manual de grep:

$ man grep

Veureu que grep té infinitat d'opcions. En els següents apartat explicarem algunes de les opcions més utilitzades i veurem exemples d'ús de grep.

No distingir entre majúscules i minúscules (-i --ignore-case)

Grep per defecte distingeix entre majúscules i minúscules (case sensitive). Es pot fer una cerca sense distingir entre majúscules i minúscules (case insensitive) utilitzant l'opció -i (--ignore-case):

Cerca recursiva (-r --recursive)

Busca al directori especificat i a tots els subdirectoris. També existeix la comanda rgrep que és equivalent a grep -r.

Utilitzar expressions regulars extenses (-E --extended-regexp)

Com ja hem comentat més amunt, grep utilitza per defecte expressions regulars bàsiques. Per utilitzar expressions regulars extenses podeu utilitzar el paràmetre -(--extended-regexp) o alternativament podeu utilitzar l'ordre equivalent egrep que és una variant de grep que utilitza expressions regulars extenses.

Cerca literal, sense expressions regulars (-F, --fixed-strings)

Si volem que el text de cerca proporcionat no sigui interpretat com a una expressió regular, hem d'utilitzar l'opció -F (--fixed-strings). La comanda fgrep és equivalent a -F. També es conegut com a fast grep.

Contar el número de línies coincidents (-c --count)

En comptes de mostrar el text compta el número de coincidències. si continuem amb l'exemple de cercar el text Linux a l'arrel del sistema:

$ grep -c -r "Linux" / | head
/sbin/fsck.ext3:0
/sbin/wpa_action:1
...
/sbin/slattach:0
...
Ctrl+C

Veureu que en els cas de coincidències en fitxers binaris el recompte retorna el valor 0.

Especificar el patró o expressió regular des de un fitxer (-f --file=camí)

Mostra el número de línia (-n --line-number)

Indica, just després del nom del fitxer (i en el cas que el fitxer trobat sigui de text i no binari), el número de la línia on s'ha trobat el text:

$ sudo grep -r -n -E "localhost\.localdomain" /etc/*
Coincidència en el fitxer binari /etc/alternatives/testparm
Coincidència en el fitxer binari /etc/alternatives/nmblookup
Coincidència en el fitxer binari /etc/alternatives/net
/etc/postfix/main.cf:33:mydestination = portatil, localhost.localdomain, , localhost

Exemples

Buscar un text en el contingut de múltiples fitxers

Per exemple per buscar el text udpcast_rec_cmd a tots els fitxers de la carpeta i subcarpetes de /opt/drbl:

$ sudo grep -n -r "udpcast_rec_cmd" /opt/drbl

Treure els comentaris d'un fitxer

Si els comentaris comencen amb el caràcter "#" podem utilitzar grep per mostrar només les línies que no tenen el caràcter:

$ cat /etc/apache2/apache2.conf | grep -v '^#'

On el símbol carat és una expressió regular que indica començament de línia.

Si a més volem treure les línies en blanc:

$ cat squid.conf | grep -v '^#\|^$\|^;'

Exemples amb expressions regulars

Recordeu que heu d'utilitzar egrep o grep -E per tal d'utilitzar grep amb expressions regulars extenses.

Buscar múltiples texts i escapar caràcters especials:

$ grep -r -E "(127\.0\.0\.1|localhost|localhost\.localdomain)" /etc

Mostrar la informació d'un paràmetre d'una ordre amb man

Podeu cercar l'opció amb:

$ man ls | grep "\-all"

Però no veureu el text explicatiu. Utilitzeu l'opció after (-A)

$ man ls | grep -A 5 "\-all"
      -a, --all
             do not ignore entries starting with .

      -A, --almost-all
             do not list implied . and ..

      --author
             with -l, print the author of each file

Resolució de problemes

Binary file (standard input) matches

$ sudo cat /var/log/messages | grep udev
Binary file (standard input) matches

Proveu amb:

$ sudo cat /var/log/messages | grep -a udev
Jan 18 01:18:22 INSEbreXen1 kernel: [    1.494629] udev: starting version 147
Jan 18 01:40:49 INSEbreXen1 kernel: [    1.451014] udev: starting version 147
Jan 18 01:44:56 karmicPV kernel: [    1.650643] udev: starting version 147

Falta de permisos (Permission Denied)

Per exemple:

$ grep -r eth0 /etc
grep: /etc/dovecot/dovecot-sql.conf: Permission denied
grep: /etc/dovecot/dovecot-ldap.conf: Permission denied

En algunes carpetes (com és el cas de la carpeta /etc), alguns fitxers no tenen permisos de lectura per als usuaris que no siguin root. Grep, com la resta d'ordres no es pot saltar aquesta restricció. Si voleu que la comanda funcioni l'haureu d'executar com a superusuari o utilitzar sudo.