Buscar texto en archivos desde la consola
Anuncio:
Cuando trabajamos con servidores y nos movemos a través de la consola, hay comandos como grep que nos facilitan mucho la vida. Por ejemplo, se usa mucho para el manejo de logs.
En este caso vamos a ver cómo buscar texto en archivos desde la consola.
Para ello ejecutaremos lo siguiente:
grep -lir "hola" "/home/usuario/"
Con esto buscaremos el texto hola en todos los archivos que hay en la carpeta usuario dentro de home
La opción l es para que el resultado se muestre por pantalla, la opción i que ignore las mayúsculas y minúsculas y la opción r que busque recursivamente en todos los subdirectorios de la ruta indicada.
Veamos un ejemplo más, imaginemos que queremos buscar todas las entradas de un determinado día que hay en los logs de nginx. Para esto, haríamos:
grep -lir "12/Oct" "/var/log/nginx/"
De esta forma podremos ver todas las entradas en los logs de nginx del 12 de octubre. Ahora si queremos contar cuantas fueron, podemos conectar la salida del comando anterior haciendo un pipe con wc, que cuenta el número de líneas:
grep -lir "12/Oct" "/var/log/nginx/" | wc
De esta forma podremos contar el número de líneas que hay. Si por ejemplo, solo quisieramos ver los primeros registros, podemos usar un pipe con head, que nos muestra las 10 primeras líneas:
grep -lir "12/Oct" "/var/log/nginx/" | head
Podemos filtrar más aún, si hemos identificado una determinada ip, podemos ver el número de registros que hay en un día de una ip. Esto lo haríamos con:
grep -lir "12/Oct" "/var/log/nginx/" | grep "LA_IP" | wc
Aquí primero, buscamos los registros el día, después filtramos cuantos son de la ip que queremos, y por último contamos el número de registros. Podríamos ver ĺos registros con:
grep -lir "12/Oct" "/var/log/nginx/" | grep "LA_IP" | less
Podemos filtrar más aún, por ejemplo, buscando solo aquellas solucitudes que son de Javascript con:
grep -lir "12/Oct" "/var/log/nginx/" | grep "LA_IP" | grep "/js/" | less
Si por el contrario quiero ver todoas aquellas que no son de Javascript lo puedo hacer con la opción -v:
grep -lir "12/Oct" "/var/log/nginx/" | grep "LA_IP" | grep -v "/js/" | less
Ahora, podemos incluso mostrar solo las columnas que nos interesen. Esto lo haremos con gawk:
grep -lir "12/Oct" "/var/log/nginx/" | grep -v "/js/" | gawk '{ print $1}'
De esta forma nos mostrará solo la primera columna del resultado. Puedo ordernarlas y además, mostrar solo las únicas.
grep -lir "12/Oct" "/var/log/nginx/" | grep -v "/js/" | gawk '{ print $1}' | sort | uniq
Ahora, vamos a enviar el resultado a un archivo de texto, esto lo hacemos con una tubería:
grep -lir "12/Oct" "/var/log/nginx/" | grep -v "/js/" | gawk '{ print $1}' | sort | uniq > /tmp/12_oct
Esto nos crear un archivo con la salida obtenida. Ten en cuenta que si el archivo existe y ya tiene contenido, se perderá. Para agregarlo en lugar de sobreescribirlo usaremos doble signo mayor que:
grep -lir "12/Oct" "/var/log/nginx/" | grep -v "/js/" | gawk '{ print $1}' | sort | uniq >> /tmp/12_oct
También te puede interesar buscar archivos desde la consola y programar de forma segura.
Esperamos que os haya sido de utilidad.