Comando grep en Linux: buscar texto, regex y filtrar archivos
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
Eso fue solo una pieza. El curso enseña el camino completo — desde tu primer comando hasta el día del examen.