En los sistemas de la familia Unix, típicamente utilizamos la herramienta find
para buscar archivos por nombre, por fecha de modificación, o tipo, tamaño, etc. Sin embargo puede ser necesario buscar archivos por contenido. Por ejemplo, buscar archivos que incluyan cierta palabra clave dentro de su texto. A tal fin es posible recurrir a grep
para realizar búsquedas de texto en archivos (lo que se conoce como full-text search).
Por supuesto que recurrir a grep
para ejecutar búsquedas full-text no es la opción más eficiente, sino que se debe recurrir a motores de búsqueda especializados como Apache Solr o la pila Elasticsearch. Sin embargo resulta útil para buscar archivos dentro de un conjunto reducido de datos, o en un sistema local.
La opción -i
permite ignorar mayúsculas y minúsculas, y la opción -l
hace que sólo se muestren los nombres de archivos que incluyen la cadena a buscar en la salida de grep
.
Veamos un ejemplo: deseo buscar todos los archivos con extensión ".html" en el directorio actual que incluyen la palabra "grafana" o cualquier variante que incluya mayúsculas ("Grafana", "graFANa", etc.):
emi@hal9000:~/linuxito.com % grep -l -i 'grafana' *.html apache-dontlog.html collectd-apache.html collectd-glassfish.html collectd-iptables.html collectd-mysql.html collectd-postgres.html collectd.html compilar-collectd-centos.html dpkg-upgrade.html grafana-collectd.html grafana-counters.html grafana-dashboard.html grafana-nginx-frontend.html grafana-piechart.html grafana-postgres.html grafana-smtp-users.html grafana.html influxdb-auth.html informix-influxdb-grafana.html nginx-grafana-influxdb-collectd.html postgres-user-password-reset.html
Para los SysAdmins resulta de gran ayuda a la hora de buscar en archivos de configuración, por ejemplo si quisiera encontrar todos los archivos de configuración que incluyen el nombre de dominio "linuxito.com":
root@webserver:~# grep -ri 'linuxito.com' /etc /etc/exim4/update-exim4.conf.conf:dc_smarthost='smtp.linuxito.com' /etc/exim4/update-exim4.conf.conf:dc_smarthost='smtp.linuxito.com' /etc/exim4/update-exim4.conf.conf:dc_readhost='webserver.linuxito.com' /etc/mailname:webserver.linuxito.com /etc/logwatch/conf/logwatch.conf:MailTo = st@linuxito.com /etc/hosts:192.168.47.153 webserver.linuxito.com webserver /etc/aliases:root: admin@linuxito.com /etc/default/aide:MAILTO=admin@linuxito.com /etc/resolv.conf:search linuxito.com /etc/apache2/sites-available/000-default.conf: ServerAdmin admin@linuxito.com /etc/apache2/sites-available/default-ssl.conf: ServerAdmin admin@linuxito.com /etc/network/interfaces: dns-search linuxito.com
La opción -r
o -R
permiten buscar recursivamente. La diferencia entre ambas es que -R
sigue los enlaces simbólicos y -r
no.
Por otro lado, cuando no se utiliza la opción -l
, junto con cada aparición de la cadena muestra el nombre del archivo junto con el contenido de la línea donde aparece (separados por dos puntos :
).
Referencias
man grep