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.
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):
Busca al directori especificat i a tots els subdirectoris. També existeix la comanda rgrep que és equivalent a grep -r.
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.
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.
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.
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
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
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 '^#\|^$\|^;'
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
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
$ 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
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.