b4rt
Comandos mágicos: Grep!
Si te gusta pasearte por la terminal, es parte de tu día a día, trabajar en esa consola de pequeñas letras, te habrás topado con varias situaciones tan particulares, como complejas, que se podrían solucionar, haciendo algún script que automatice ciertos procesos. Vamos a ver algunos ejemplos del uso del comando grep!
Que es grep?
Es un programa, pequeño en tamaño, pero grande en funcionalidades, el cual nos permitirá buscar patrones de “texto” dentro de algún fichero, archivo, lista…
Ejemplo 1:
Listamos todo lo que haya dentro de un directorio, pero vamos a filtrar esa busqueda, por el tipo de formato, por ejemplo, buscar solo los ficheros con extensión “.txt”, o “.lst”, o encontrar las imágenes “.jpg”, para esto vamos a concatenar la salida del comando, con grep.
De la forma:
root@b4rt$ ls -l | grep txt
Como vemos en el output, he filtrado primero por la extension “.lst”, luego por “.txt” y finalmente por “.jpg”.
Ejemplo 2:
Ahora, tenemos el fichero “/etc/passwd”, como sabemos, tiene información de los usuarios del sistema. Usaremos 2 formas,
La primera es utilizando “cat” para imprimir el contenido y concatenar grep.
root@b4rt$ cat /etc/passwd | grep root
La salida, será la misma
root@b4rt$ grep /etc/passwd
Ejemplo 3:
Ahora, que pasa si quiero hacer lo contrario, imprimir todo, ignorando las lineas que tengan el texto deseado. Un ejemplo sencillo, en este mismo fichero ‘/etc/passwd’, quiero que me imprima los usuarios que no tienen permisos de loguearse en el sistema. En el fichero passwd, los usuarios que tengan la linea “nologin”, son los usuario que no pueden loguearse en el sistema.
Podemos mostrar a todos los demás utilizandoel flag (-v).
root@b4rt$ grep -v "nologin" /etc/passwd
Ahora, identificando los PIDs >1000, podemos darnos cuenta de que el usuario “b4rt,test,admin, y root”, pueden loguearse en el sistema, aún podemos optimizar esta salida, ignorando también las lineas que tengan “/bin/false”. Así que usaremos grep, y vamos a contatenar otra vez grep.
root@b4rt$ grep -v "nologin" /etc/passwd | grep -v "/bin/false"
Es simplemente imaginarse algo e intentar hacerlo, podemos filtrar los que usen la shell “/bin/sh”, y los que usen la shell “ZSH” (dicho sea de paso, mi shell favorita).
Ejemplo 4:
Ahora, para este otro ejemplo, vamos a ir en busca de los logs de un servidor web.
Tengo una IP que se ha conectado a mi sitio web, y quiero buscar todos los errores “404” que ha provocado, tal vez haciendo algún escaneo. Esta vez vamos a utilizar ‘Tail‘ para ver los logs.
Así que primero imprimimos los logs, filtramos ese resultado por una IP, y nuevamente filtramos esa salida, buscando las coincidencias con “404”, de esta forma tenemos en pantalla sólo las peticiones realizadas por la IP, que provocaron un error 404.
root@b4rt$ tail -900 /var/log/httpd/access_log | grep "37.46.114.43" | grep "404"
Ejemplo 5:
Ahora imaginemos que quieres ver el archivo de configuración de sshd_config, de un servidor, pero no deseas abrir vim, o ver todo por consola, sólo quieres ver las lineas que están activas, es decir, las lineas no comentadas.
Podriamos utilizar el flag ” -v “, para omitir las lineas que contengan un #, pero el output se vería de esta forma, mostrandonos los saltos de linea, algo que no queremos, pues la salida se hace realmente grande.
root@b4rt$ grep -v "#" /etc/ssh/sshd_config
Ejemplo 6:
Hay otra forma de hacer esto, es imprimir todas las lineas que empiezen por una letra o un número. de esta forma, ignoramos cualquier caracter especial al inicio de una linea, eso es ideal cuando queremos imprimir archivos de configuración.
root@b4rt$ grep "^[[:alnum:]]" /etc/ssh/sshd_config
– En el comando utilizamos [[:alnum:]],
es un código prédefinido para tener un pattern.
– Tambien utilizamos el símbolo ^
, el cual sirve para buscar coincidencias al inicio de la fila, ya sea un caracter o una palabra.
Así que tenemos esta serie de códigos que podemos usar para diferentes tareas
"[[:alnum:]]"
Pattern (A-Z , a-z , 0-9)"[[:alpha:]]"
Pattern (A-Z , a-z )
"[[:digit:]]"
Pattern ( 0-9)
"[[:blank:]]"
Pattern (A-Z,a-z , 0-9
"[[:upper:]]"
Pattern (A-Z,a-z , 0-9)
"[[:lower:]]"
Pattern (a-z)
"[[:punct:]]"
Pattern [! ” # $ % & ‘ ( ) * + , – . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~. ]
"[[:graph:]]"
Caracteres Alfanumericos y Caracteres de puntuación "[[:space:]]"
Espacios en blanco, ya sean Tabs, saltos de linea, espacios…"[[:print:]]"
Caracteres Alfanumericos , Signos de Puntuación y espacios en blanco "[[:xdigit:]]"
Caracteres hexadecimales( A-F, a-f, 0-9)
grep -F, nos permite utilizar un fichero en el cual hayamos declarado una lista de palabras, para buscar en otro. Grep buscará todas las coincidencias.
Por ejemplo, tenemos el fichero “lista.txt”.
grep -E, nos pemite utilizar uno o muchos strings para buscar entre algún fichero, de la forma:
grep -E 'string1|string2|string3'
Un ejemplo buscando múltiples coincidencias en un log, para enumerar una o más IPs, o tambíen para buscar algún string en particular.
root@b4rt$ for i in {1..255}; do ping -c 1 -W 1 192.168.1.$i | grep 'from'; done
root@b4rt$ ip addr | grep -Po '(?!(inet 127.\d.\d.1))(inet \K(\d{1,3}\.){3}\d{1,3})'
Hasta ahora, creo que ya tenemos lo básico para utilizar grep, ahora vamos con el comando FIND.
- julio 1, 2019
- , 7:54 pm
- , Linux, Servidores