Grep

De Manuais Informática - IES San Clemente.
Revisión del 19:23 7 nov 2012 de Vieites (discusión | contribs.)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)
Ir a la navegación Ir a la búsqueda
O comando grep nos permite buscar, dentro de arquivos, as liñas que coinciden cun patrón.
Por defecto, grep imprime as liñas encontradas na saída estándar. É dicir, que podemos velo directamente na pantalla, ou redireccionar a saída estándar a un arquivo.
Vexamos as opcións mais empregadas:
-c Devolve só o número de liñas que coinciden, non o seu contido.
-e PATRÓN Permítenos especificar varios patróns de procura ou protexer aqueles patróns de procura que comezan có signo -.
-r Busca recursivamente dentro de todos os subdirectorios do directorio actual.
-v Móstranos as liñas que non coinciden có patrón buscado.
-i Ignora a distinción entre maiúsculas e minúsculas.
-l Que só mostraría os nomes dos arquivos que conteñan o obxectivo buscado.
-n Numera as liñas na saída.
-E Permítenos usar expresións regulares.
-o Indícalle a grep que nos mostre só a parte da liña que coincide có patrón.
-f ARCHIVO Extrae os patróns do arquivo que especifiquemos. Os patróns do arquivo deben ir un por liña.
-H Imprímenos o nome do arquivo con cada unha das coincidencias.
O programa grep toma a expresión que recibe como parámetro como unha expresión regular básica. Iso quere dicir que algúns caracteres teñen un significado especial polo que hai que andar con ollo.
Vexamos algúns exemplos:
  • Buscar todas as liñas que conteñan a palabra iface no arquivo /etc/network/interfaces:
$ grep iface /etc/network/interfaces
# Outro xeito de facelo, sería:
$ cat /etc/network/interfaces | grep iface
  • Buscar todas as liñas que conteñan a palabra iface eth0 no arquivo /etc/network/interfaces:
$ grep "iface eth0" /etc/network/interfaces
  • Buscar todas as liñas que teñan palabras que comecen pola letra i no arquivo /etc/network/interfaces:
$ grep -E '\<i.*\>' /etc/network/interfaces
  • Buscar todas as liñas que comecen pola letra i no arquivo /etc/network/interfaces:
$ grep -E '^i' /etc/network/interfaces
  • Buscar todas as liñas que rematen en por ".DS" ou ".DE":
$ grep -E '\.D[SE]$' arquivo
  • Buscar todas as liñas que comecen pola letra i no arquivo /etc/network/interfaces:
$ grep -E '^i' /etc/network/interfaces
  • Contar o número de interfaces de rede que temos definidos no ficheiro /etc/network/interfaces:
$ grep -c "iface eth" /etc/network/interfaces
  • Mostrar por pantalla as liñas do arquivo /etc/apt/sources.list que non son comentarios:
$ grep -v "#" /etc/apt/sources.list
  • Buscar as liñas nas que apareza a palabra "UNIX" pero sin distinguir entre maiúsculas e minúsculas (ignore case):
$ grep -i "unix" arquivo
  • Mostrar as liñas dun arquivo que contén a palabra PONTEVEDRA e LUGO:
$ grep -e "PONTEVEDRA" -e "LUGO" arquivo
  • Mostrar as liñas dun ficheiro que contén a palabra PONTEVEDRA e LUGO, numerando as liñas de saída:
$ grep -n -e "PONTEVEDRA" -e "LUGO" arquivo
  • Mostrar os ficheiros que conteñen a palabra "LUGO" no directorio actual e todos os seus subdirectorios:
$ grep -r "LUGO" *
Vexamos algúns exemplos prácticos:
  • Obter a dirección MAC da interfaz de rede eth0 da nosa máquina:
$ ifconfig eth0 | grep -oiE '([0-9A-F]{2}:){5}[0-9A-F]{2}'
A expresión regular empregada podemos dividila en dúas partes:
- ([0-9A-F]{2}:){5} Buscamos 5 conxuntos de 2 carateres seguidos de dous puntos.
- [0-9A-F]{2} Seguido por un conxunto de dous caracteres.
Como as direccións MAC se representan en hexadecimal, os caracteres que buscamos son os números do 0 ao 9 e as letras dende a A á F.
  • Extraer a lista de direccións de correo electrónico dun arquivo:
grep -Eio '[a-z0-9._-]+@[a-z0-9.-]+[a-z]{2,4}' fichero.txt
A expresión regular empregada podemos dividila nas seguintes partes:
- [a-z0-9._-]+ Unha combinación de letras, números, e/ou os símbolos ., _ e - de un ou mais caracteres.
- @ Seguido dunha arroba.
- [a-z0-9.-]+ Seguido dunha cadea de letras, números e/ou os símbolos . e -.
- [a-z]{2,4} Seguido dunha cadea de entre dous e catro caracteres.
  • Obter a dirección IP da interfaz de rede eth1 da nosa máquina:
$ ifconfig eth1 | grep -oiE '([0-9]{1,3}\.){3}[0-9]{1,3}' | grep -v 255
A expresión regular empregada podemos dividila nas seguintes partes:
- ([0-9]{1,3}\.){3} Representa 3 bloques de entre un e tres díxitos separados por puntos. Observar que, como o punto é un metacaracter, hai que empregar o caracter de escape \ para que non sexa interpretado como un metacaracter, sinon como un caracter normal.
- [0-9]{1,3} Representa o último bloque da dirección IP, que está formado por un número de entre 1 y 3 díxitos.