fbpx Comando grep en Linux: buscar texto regex y filtrar archivos | Certificação Linux

Comando grep en Linux: buscar texto, regex y filtrar archivos

📅 01/01/2019 ⏱ 7 min ✍️ Uira Ribeiro
Linuxcomandos
Comando grep en Linux: buscar texto, regex y filtrar archivos
Exam Pass App — mais de 7.000 questões LPI, offline, em 5 idiomas, disponível no Android e na App Store
Disponible en
Google Play
Disponible en
App Store

El comando grep en Linux es ampliamente usado en el día a día de las tareas administrativas en Linux. Este filtra las líneas de un archivo determinado buscando una expresión regular como patrón.

El grep puede leer uno o más archivos que se pasan como argumento o puede recibir en la entrada estándar la redirección de la salida de otro proceso. Si el grep recibe más de un archivo o un comodín como argumento para realizar su búsqueda, indicará el nombre del archivo seguido de dos puntos y la línea encontrada.

El grep utiliza el patrón de Expresiones Regulares POSIX BRE.

Por lo tanto, los meta-caracteres ? + { } | (  )  no tienen significado especial. En el patrón BRE estos caracteres solo se interpretan con significado especial si están precedidos por la barra invertida  \?   \+   \{   \}  \|   \(   \).

Sus opciones más frecuentes son:

  • -c: Muestra solo el conteo de las ocurrencias en los archivos y no las líneas donde se encontraron;
  • -h: Muestra solo las líneas encontradas, sin la indicación del nombre de los archivos; 
  • -i: Busca las ocurrencias ignorando si las letras están en mayúsculas o minúsculas;
  • -v: Muestra todas las líneas del archivo buscado menos las ocurrencias encontradas. Tiene el efecto inverso;
  • -n: Muestra, además del texto de las líneas encontradas, el número de las líneas dentro de los archivos;
  • -B n: Muestra n líneas antes de la línea encontrada;
  • -A n: Muestra n líneas después de la línea encontrada.
  • -E    Cambia el patrón POSIX BRE a POSIX ERE.
  • -F    No interpreta ningún meta-carácter

Ejemplos:

Busca la palabra uira en el archivo /etc/passwd:

$ grep uira /etc/passwduira:x:500:100:uira:/home/uira:/bin/bash

Busca todas las líneas que empiezan con la letra u en el archivo /etc/passwd. El acento circunflejo simboliza el inicio de una línea:

$ grep "^u" /etc/passwduucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bashuira:x:500:100:uira:/home/uira:/bin/bash

Busca todas las líneas terminadas con la palabra false. El símbolo $ representa el fin de una línea:

$ grep "false$" /etc/passwdmail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/falsewwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false

Busca todas las líneas que inician con las vocales en /etc/passwd. La expresión regular llamada lista busca cualquiera de los caracteres dentro del corchete:

$ grep "^[aeiou]" /etc/passwduucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bashat:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bashuira:x:500:100:uira:/home/uira:/bin/bashalias:x:501:1000::/var/qmail:/bin/false

Busca por todas las líneas en las que el primer carácter sea cualquiera y el segundo carácter sea una vocal. El punto en la expresión regular simboliza "un carácter cualquiera":

$ grep "^.[aeiou]" /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/bin/bashnews:x:9:13:News system:/etc/news:/bin/bashuira:x:500:100:uira:/home/uira:/bin/bash

Busca por líneas que contengan una secuencia de al menos cuatro números consecutivos:

$ grep "[0-9][0-9][0-9][0-9]" /etc/passwdsquid:x:31:65534:WWW-proxy squid:/var/cache/squid:/bin/falsenobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bashalias:x:501:1000::/var/qmail:/bin/falseqmaild:x:502:1000::/var/qmail:/bin/false

Busca en todos los archivos en un directorio la ocurrencia de la palabra security.

$ grep security *

Vea el archivo datas:

$ cat datas1978-05-11	João	1976-02-23	Maria2001-07-11	Pedro1980-05-14	Carla

Para buscar las personas nacidas el día 11 usando grep, se debe indicar que los caracteres {  } son meta-caracteres usando la barra invertida:

$ grep "^[0-9]\{4\}-[0-9]\{2\}-11" datas
1978-05-11    João
2001-07-11    Pedro

Para buscar una ocurrencia en todos los subdirectorios, se utiliza la opción de recursividad "-r":

$ grep -r uira *

Para invertir una búsqueda (traer todas las ocurrencias, menos algún término, se usa la opción "-v".

En este ejemplo, retorna todas las líneas no comentadas del php.ini:

$ grep -v "^;" /etc/php.ini

Para listar solo las líneas con direcciones de correo electrónico válidas:

$ grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' emails.txt

Para listar todas las direcciones IP únicas que accedieron a un servidor web:

$ grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" /var/log/nginx/access.log  | sort | uniq

También es posible usar expresiones con O para realizar búsquedas de más de un término:

$ grep -E 'carla|uira' arquivo

Vale recordar que grep hace distinción de mayúsculas y minúsculas. Para realizar una búsqueda independiente de si el texto está en mayúscula o minúscula, se puede usar la opción "-i":

$ grep -i uira *

Las búsquedas con la opción "-i" demoran más tiempo.

Es posible usar los corchetes para especificar ocurrencias de algún carácter de la búsqueda en mayúscula o minúscula:

$ grep [Uu]ira *

Para mostrar la línea de una determinada ocurrencia:

$ grep -n uira arquivo

Para mostrar una línea antes y después del término, se puede usar la opción "-C N", donde N es el número de líneas:

$ grep -C 1 function LivroSubcapituloList.php    
    public static function onChangeLivro($param = null)
    {

Comando egrep

El comando egrep funciona como la opción -E del grep.

Este en realidad utiliza el patrón POSIX de Expresiones Regulares ERE en la búsqueda. Esto significa que la barra invertida debe usarse para definir que el siguiente carácter es un carácter literal y no un meta-carácter como en el patrón POSIX BRE.

Esto significa que los caracteres  ?  +  {  }  |   (  ) no necesitan de la barra invertida para funcionar como meta-caracteres.

Tome como ejemplo la lista de cumpleaños. Con el comando grep y sin las barras invertidas, el grep no es capaz de encontrar los cumpleaños de Mayo:

$ grep "^[0-9]{4}-05-[0-9]{2}" datas

Ya el egrep es capaz de interpretar las {  } como meta-caracteres sin la barra invertida. Es importante que usted recuerde la diferencia del uso de las barras invertidas entre el grep (que las necesita para indicar meta-caracteres) y el egrep (cuyo efecto de las barras invertidas es inverso, indicando un carácter común):

$ egrep "^[0-9]{4}-05-[0-9]{2}" datas1978-05-11	João	1980-05-14	Carla

Solo con la opción -E el grep es capaz de encontrar las ocurrencias:

$ grep -E "^[0-9]{4}-05-[0-9]{2}" datas1978-05-11	João	1980-05-14	Carla

Es muy importante que usted sepa lo que hace la barra invertida en el patrón POSIX BRE x POSIX ERE.

Comando fgrep

El comando fgrep también es similar a grep, pero no soporta expresiones regulares, buscando únicamente una clave de búsqueda o un texto común en los archivos.

Por este motivo, es más rápido que grep, pero menos versátil. 

Es lo mismo que la opción -F de grep.

Ejemplo:

$ fgrep batata *listaab:batatasupermercado:batata

Aprende mucho más sobre Linux en nuestro curso online. Puedes realizar la inscripción aquí. Si ya tienes una cuenta, o quieres crear una, simplemente ingresa o crea tu usuario aquí.

¿Te gustó? Comparte

Uira Ribeiro

Prof. Uirá Ribeiro

Chair do Board do Linux Professional Institute

Después de años viendo profesionales perder horas en tareas simples por no conocer las herramientas correctas de Linux, decidí enseñar.
Hoy soy autor de la mayoría de los Materiales de Aprendizaje oficiales de la LPI y mentor de más de 14,000 alumnos certificados.

Conoce mi historia completa →

Eso fue solo una pieza. El curso enseña el camino completo — desde tu primer comando hasta el día del examen.

Certificação Linux — a plataforma líder em certificações Linux no Brasil
WhatsApp