Está en la página 1de 19

Análisis en crudo mediante comandos

de Linux
-Comandos y explicación

cat
El comando “cat” sirve para imprimir el contenido de un archivo en la consola de Linux en
texto plano. También puede ser utilizado para concatenar el contenido de varios archivos de
texto. Se recomienda combinar redirigir el resultado a otros ficheros con los caracteres de
comparación (“<” y “>”), añadir el resultado al contenido de un fichero de texto (“<<” y “>>”)
o combinarlo con otros comandos mediante el uso de pipes, como por ejemplo “grep”.
Algunos de los parámetros más relevantes de “cat” son:
-b == Numera las líneas del archivo que no estén vacías.
-n == Numera todas las líneas del archivo
-s ==Combina las líneas vacías que vayan seguidas en una única línea
-T ==Muestra las tabulaciones como ^I

wget
El comando “wget” tiene como función descargar un archivo de Internet indicado por el
usuario mediante su dirección por hipervínculo. Soporta HTTP, HTTPS y FTP; también puede
recuperar archivos a través de proxies HTTP. Si no se le especifica un archivo, “wget”
descargará el código html de la página y lo guardará en un fichero, pero también puede
descargar páginas XHTML y CSS. El comando no es interactivo, con lo que puede ejecutarse
en segundo plano y sin que el usuario este logueado.
Algunos de los parámetros más relevantes de “wget” son:
-o == Guarda el log en un archivo de log a especificarse
-d == También imprime información de debug
-q == Desactiva el output de wget

-nv == Desactiva parte del output de wget, sin embargo, se seguirá mostrando
información básica y errores
-i == Lee URLs de un archivo local, especificado después del parámetro con un “=”.

less
El comando “less” permite leer un archivo de texto pudiendo desplazarse por este hacia
arriba y hacia abajo. Es más rápido que otros editores de texto al no tener que leer todo el
input a la vez.
Less no tiene parámetros relevantes al ejecutarlo, pero sí mientras lee un archivo. Algunas
de estas funcionalidades son las siguientes:
d == Avanza en el texto media ventana
u == Retrocede en el texto media ventana
/ == Busca el texto especificado posteriormente en el documento hacia delante
? == Busca el texto especificado posteriormente en el documento hacia atrás
p == Regresa al principio del archivo
Escribir un número desde el programa permite avanzar ese número de líneas en el
documento.

zcat
El comando “zcat” es idéntico al comando “gunzip –c”. Permite ver el contenido de un
archivo comprimido sin descomprimirlo.
Algunos de los parámetros más relevantes de “zcat” son:
-l == Muestra información adicional del archivo
-q == Oculta las advertencias y errores

zless
Permite leer un archivo de texto comprimido y desplazarse por este. Sus funcionalidades son
las mismas que las del comando “less”.

tail
Imprime las últimas 10 líneas de los archivos especificados. En caso de que se le indiquen
más de un archivo, indicará el nombre del archivo antes de imprimir su contenido.
Algunos de los parámetros más relevantes de “tail” son:
-c == Imprime los últimos bytes, cuyo número es especificado tras el parámetro
-n == Imprime el último número de líneas especificadas tras el parámetro
-q == En caso de haber más de un archivo, no imprime los nombres de estos
-v == Siempre escribe primero el nombre del alrchivo
-f == Permite seguir actualizaciones del archivo de texto en tiempo real
-f –s == Lo mismo, pero “s” hace que el output se actualice tras los segundos especificados
posteriormente

head

Imprime las 10 primeras líneas de los archivos especificados, indicando el nombre de cada
archivo si se indica más de uno.
Tiene los mismos parámetros que “tail”, pero sin los que permiten ver actualizaciones del
archivo en tiempo real (-f y –s).

sed

El comando “sed” es un editor de flujo. Permite transformar el texto de un archivo o de


texto obtenido de otro comando ejecutado en paralelo mediante una tubería. Es más
eficiente que el uso de un editor de texto convencional por su precisión y porque se puede
utilizar en scripts.
Algunos de los parámetros más relevantes de “sed” son:
-e == Permite hacer uso de uno o varios scripts sed especificados posteriormente
-f == Hace que el script sed se extraiga de un archivo
-s == Trata varios archivos por separado, en lugar de unirlos en un único flujo de datos.
Dentro del comando, se le deben dar órdenes en una sintaxis para transformar el texto de un
archivo. Se profundizará más en esta sintaxis en la sección de ejemplos.

grep
Imprime en la consola la información de uno o más archivos que coincida con los patrones
especificados.
Algunos de los parámetros más relevantes de “grep” son:
-f == Obtiene parámetros de un archivo, indicados por línea.
-i == Ignora las mayúsculas y minúsculas
-v == Invierte la búsqueda, mostrando texto que no coincida con el patrón
-c == Cuenta las líneas en las que haya coincidencias con el patrón

cut
Permite eliminar secciones específicas de las líneas extraídas de un archivo de texto. Se
recomienda utilizarlo para redirigir la salida a otro fichero o junto con otros parámetros que
impriman texto en él terminal utilizando tuberías, como “cat”.
Algunos de los parámetros más relevantes de “cut” son:
-b == Recorta solo un número de bytes
-c == Solo recorta ciertos caracteres
-d == Añade un delimitador para el comando, indicado posteriormente.
-s == No imprime líneas que contengan delimitadores.

sort

Permite ordenar las líneas de uno o varios archivos de texto, también funciona con inputs
estándar. Por defecto, las ordena en orden alfabético.
Algunos de los parámetros más relevantes de “sort” son:
-b == Ignora las líneas en blanco
-f == Ignora las mayúsculas
-n == Ordena a partir de valores numéricos en una línea
-r == Invierte el orden de las líneas, opuesto al alfabético
-R == No ordena, imprime las líneas de forma aleatoria
-u == Unifica las líneas idénticas

uniq
Imprime el contenido de un archivo de texto o un input omitiendo estándar omitiendo las
líneas que se repitan.
Algunos de los parámetros más relevantes de “uniq” son:
-c == Cuenta el número de líneas repetidas de un tipo
-i == Ignora las mayúsculas y minúsculas de líneas repetidas
-s == No compara el primer número de caracteres especificado tras el parámetro

wc
Cuenta e imprime el número de líneas, palabras y bytes de cada archivo especificado.
Algunos de los parámetros más relevantes de “wc” son:
-c –m –l -w == Para especificar la información a imprimir: bytes, caracteres, líneas o
palabras.
-L == Indica la longitud de la línea más larga en los archivos.

awk
Se utiliza para procesar y transformar datos mediante una sintaxis de lenguaje de
programación. Permite hacer operaciones matemáticas, reemplazar palabras o patrones,
procesar texto y mostrar la información que cumpla con ciertos requisitos, etc…
Algunas de las opciones, seguidas por expresiones awk, son las siguientes:
-f == Lee el código awk de un archivo
-v == Crea una variable
-c == Ejecuta el comando en modo de compatibilidad

-Ejemplos de uso de comandos

-Ejemplos de cat:
-Comando para concatenar y leer el contenido de los archivos del directorio “misLogs” de nombre
“Log*” y redirigir la salida a “Logsunidos.txt” en el directorio actual:

cat misLogs/Log* > Logsunidos.txt

Resultado:

-Comando para pasar la salida de la lectura de un fichero a otro comando. Para este ejemplo, el
comando “grep”.

cat misLogs/Log1 | grep “Log”

Resultado:
-Ejemplos de wget:
-Uso del comando wget para descargar de la red los documentos que vayamos a necesitar para los
futuros ejemplos:

wget https://seguridadinformatica.s3.us-east-
2.amazonaws.com/Logs_ejemplo/ubuntu.auth.Log.gz

https://seguridadinformatica.s3.us-east-
2.amazonaws.com/logs_ejemplo/anonimizado.access.log.gz

https://www.gnu.org/licenses/gpl.txt https://people.sc.fsu.edu/~jburkardt/data/csv/trees.csv

-Ejemplos de less:
-Uso del comando less para poder revisar y desplazarse por el resultado del comando “grep” tras
buscar las líneas de texto con la cadena “Invalid user” en el fichero “Ubuntu.auth.log”:

grep ‘Invalid user’ Ubuntu.auth.log | less

Resultado (habiendo buscado posteriormente al usuario “cms”):

-Ejemplos de zcat, zless, tail y head:


-Mostrar el contenido del fichero “anonimizado.access.log.gz” en el terminal sin descomprimirlo y
posteriormente redirigir la salida al comando “head” para mostrar solo las 100 primeras líneas:

zcat anonimizado.access.log.gz | head -100

-Mostrar el contenido del fichero “anonimizado.access.log.gz” en el terminal pudiendo desplazarse


por este y sin haberlo descomprimido:

zless anonimizado.access.log.gz
-Descomprimir el archivo “anonimizado.access.log.gz”:

gunzip anonimizado.access.log.gz

-Mostrar las 10 últimas líneas de “anonimizado.access.log.gz”:

tail -10 anonimizado.access.log

Resultado:

-Mostrar las 10 primeras líneas de “anonimizado.access.log.gz”:

head -10 anonimizado.access.log

Resultado:

-Ejemplos de sed:
-Imprimir la primera línea del documento “gpl.txt” y sustituir las minúsculas por mayúsculas:

head -1 gpl.txt | sed ‘y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/’

Resultado:

-Eliminar la primera línea del documento “gpl.txt”:

sed '1d' gpl.txt

-Eliminar las líneas en blanco del fichero anterior, “/^$/d” indica eliminar aquello que empieza y
acaba sin ningún carácter en medio:

sed ‘/^$/d’ gpl.txt

-Imprimir solo el contenido de cada 10 líneas del fichero anterior:


sed –n 0~10p gpl.txt

-Imprimir el contenido de “milog.log”, sustituir las cadenas de texto “sitioreal.es” por “ejemplo.es” y
guardar el resultado en un fichero llamado “anonimizado.milog.log”

cat milog.log | sed s/sitioreal.es/ejemplo.es/g > anonimizado.milog.log

Resultado:

-Ejemplos de grep, cut, sort, uniq y wc:


-Mostrar las líneas del documento “gpl.txt” en las que ponga “license” ignorando las mayúsculas y
minúsculas:

grep -i "license" gpl.txt

-Mostrar las líneas del documento “gpl.txt” en las que ponga “the” e indicar el número de línea:

grep –n “the” gpl.txt

Resultado:

-Mostrar las líneas del documento “gpl.txt” que empiecen por “GNU”:

grep "^GNU" gpl.txt

Resultado:
-Mostrar las líneas del documento “gpl.txt” que acaben por “and”:

grep "and$" gpl.txt

Resultado:

-Mostrar las líneas del documento anterior en las que ponga “cept” acompañado previamente por
dos caracteres, sin importar cuales sean:

grep "and$" gpl.txt

Resultado:

-Mostrar las líneas del documento anterior con los caracteres “t” y “o” con “w” u “o” (o ambos) en
medio:

grep "t[wo]o" gpl.txt

Resultado:
-Mostrar las líneas del documento anterior en las que ponga “ode” pero no precedidas de “c”:

grep "[^c]ode" gpl.txt

Resultado:

-Mostrar las líneas del documento anterior que comiencen por mayúsculas:

grep "^[A-Z]" gpl.txt

Resultado:

-Mostrar las líneas del documento anterior que incluyan texto entre paréntesis:

grep "([A-Za-z ]*)" gpl.txt

Resultado:
-Mostrar todas las líneas del documento anterior que tengan la cadena de texto “free” sin un espacio
posteriormente (-E hace que interprete el patrón como una expresión regular extendida):

grep -E "free[^[:space:]]+" gpl.txt

Resultado:

-Mostrar las líneas del documento anterior que contengan tres vocales seguidas:

grep -E "[AEIOUaeiou]{3}" gpl.txt

Resultado:

-Mostrar las líneas del documento anterior que contengan de 16 a 20 caracteres alfabéticos seguidos:

grep -E "[[:alpha:]]{16,20}" gpl.txt

Resultado:
-Leer el contenido de “gpl.txt”, buscar caracteres alfabéticos entre paréntesis en la salida, e imprimir
lo que no tenga entre paréntesis “copy” (-i indica ignorar mayúsculas y –v invertir la búsqueda):

cat gpl.txt | grep "([A-Za-z ]*)" | grep -iv 'copy'

Resultado:

-Buscar las líneas que contengan la cadena “user user” en el documento “ubuntu.auth.log”:

grep "user user" ubuntu.auth.log

-Buscar y contar las líneas que contengan “user user” en el documento “Ubuntu.auth.log”:

grep -c "user user" ubuntu.auth.log

Resultado:

-Imprimir las líneas del documento anterior que contengan “port” seguido de espacio y el número
4792:

grep -P "(?<=port\s)4792" ubuntu.auth.log

Resultado:

-Imprime las líneas del documento anterior que contengan “Invalid user cms”, las tres líneas
anteriores y las 2 siguientes:

grep -B 3 -A 2 'Invalid user cms ' ubuntu.auth.log


-Imprime 5 solo líneas del documento anonimizado.access.log que contengan la cadena
“storelocator” y 1 línea antes y después del resultado:

grep -C 1 -m 5 'storelocator' anonimizado.access.log

-Buscar las líneas del documento anterior que contengan “AdminDashboard” y posteriormente
buscar en la salida las líneas en las que ponga POST:

grep AdminDashboard anonimizado.access.log | grep POST

-Contar el número de líneas, palabras y caracteres del documento “gpl.txt”:

wc -lwc gpl.txt

Resultado:

-Contar el número de líneas del documento “ubuntu.auth.log”:

wc -l ubuntu.auth.log

Resultado:

-Contar el número de líneas del documento “anonimizado.access.log”:

wc -l anonimizado.access.log

Resultado:
-Ejemplos de awk:
-Imprimir las líneas del documento “gpl.txt” cuya longitud sea superior a 74 caracteres:

awk 'length($0) > 74' gpl.txt

Resultado:

-Imprimir las entradas cuyo número de campos sea superior a 8 (NF significa “Number of Fields”):

awk 'NF > 8' ubuntu.auth.log

-Imprimir las líneas del documento “auth.log” cuyo campo 6 sea “failed” y cuyo campo 7 sea
“password”:

awk '(tolower($6) == "failed") && ($7 == "password") {print $0}' /var/log/auth.log

-En el documento “ubuntu.auth.log”, imprimir el campo 11 de las líneas que contengan “sshd” y
“Failed password for invalid user” y cualquier texto en medio:

awk '/sshd.*Failed password for invalid user/ { print $11 }' ubuntu.auth.log

-Imprimir los campos 2 y 4 del documento “tres.csv” y separarlos por comas (-F implica utilizar “fs”
para colocar separadores entre campos):

awk -F ',' '{print $2, $4}' trees.csv

-Imprimir los campos 1 y 3 del documento anterior y sustituir las comas por “|”:

awk -F ',' 'BEGIN {OFS = "|"} {print $1, $3}' trees.csv

-Del documento anterior, imprimir el campo equivalente al número de campos menos 1:

awk -F ',' '{print $(NF-1)}' trees.csv


-Del documento anterior, imprimir las líneas que empiecen por 1:

awk '/^1/ {print}' trees.csv

Resultado:

-Del documento anterior, imprimir las líneas que terminen por 2:

awk '/2$/ {print}' trees.csv

Resultado:

-Del documento anterior, imprimir las líneas cuyo número esté entre el 2 y el 8:

awk 'NR >= 3 && NR <= 7 {print}' trees.csv

Resultado:

-Del documento anterior, imprimir todas las líneas salvo aquellas en las que ponga “Index”:

awk '!/Index/ {print}' trees.csv

-Imprimir la línea de mayor longitud del documento “gpl.txt”:

awk '{ if (length > max) {max = length; longest = $0}} END {print longest}' gpl.txt

Resultado:
-Imprime la raíz cuadrada del campo 3 del documento “trees.csv”:

awk -F ',' '{$3=sqrt($3)} {print}' trees.csv

-Cuenta las líneas del fichero “ubuntu.auth.log”en las que pone “error” e imprime el número:

awk '/error/{count++} END{print count}' ubuntu.auth.log

Resultado:

-Del documento anterior: imprimir “IP:”, el primer campo de las líneas, “Peticion:” y el segundo
subcampo del sexto campo:

awk '{printf "IP: %s, Peticion: %s\n", $1, substr($6,2)}' anonimizado.access.log

-Imprimir las líneas del documento “access.log” cuyo noveno campo sea 200:

awk '$9 ~ /200/' access.log

-Imprimir las líneas de “anonimizado.access.log” cuya fecha del cuarto campo esté entre
“15/Oct/2023:03:00:00” y “15/Oct/2023:04:00:00”:

awk ' substr($4,2,20)>= "15/Oct/2023:03:00:00" && substr($4,2,20) < "15/Oct/2023:04:00:00"'


anonimizado.access.log

-Imprimir aquellas líneas del fichero anterior cuyo primer campo sea “143.198.122.147”:

awk '$1 == "143.198.122.147"' anonimizado.access.log

-Del documento anterior, detectar aquellas líneas cuyo sexto campo sea “Googlebot” y
posteriormente imprimir su segundo campo.

awk -F\" '($6 ~ /Googlebot/){print $2}' anonimizado.access.log | awk '{print $2}'

-Ejemplos combinados:
-Imprimir el contenido del documento “anonimizado.access.log”, buscar las líneas que contengan
“mercedes-napa-negro-tira-charol-negro.jpg”, imprimir el primer campo, ordenar el resultado por
valor numérico y omitir las líneas que se repiten (poniendo delante el número de veces que se
repite), posteriormente ordenarlos de forma descendente e imprimir las 10 primeras líneas:
cat anonimizado.access.log | grep mercedes-napa-negro-tira-charol-negro.jpg | awk '{print $1}' |
sort -n | uniq -c | sort -rn | head

Resultado:

-Imprimir el fichero anterior, buscar las líneas con la cadena “fbclid” y contar el número de líneas:

cat anonimizado.access.log | grep 'fbclid' | wc –l

Resultado:

-Imprimir el noveno campo del fichero anterior, ordenarlo, omitir líneas repetidas (poniendo delante
el número de veces que se repite) y volver a ordenar la salida en orden descendente:

awk '{ print $9 }' anonimizado.access.log | sort | uniq -c | sort –rn

Resultado:

-Buscar aquellas líneas del documento anterior cuyo noveno campo sea 404, imprimir el séptimo
campo, ordenar, omitir líneas duplicadas y ordenar el resultado en orden descendente:

awk '($9 ~ /404/)' anonimizado.access.log | awk '{ print $7 }' | sort | uniq -c | sort –nr

-Imprimir los campos 1, 4 y 6 de las líneas del documento anterior cuyo segundo campo empiece por
“GET /en/80307-36474-fabric-kensington-bag-beige-comb-fab.html”:
awk -F\" '($2 ~ "^GET /en/80307-36474-fabric-kensington-bag-beige-comb-fab.html") {print
$1,$4,$6}' anonimizado.access.log

-Seleccionar aquellas líneas del documento anterior cuyo noveno campo no sea 200 ni 304,
posteriormente imprimir el noveno y séptimo campo de esas líneas, ordenarlos alfabéticamente y
omitir líneas repetidas:

awk '($9 !~ /200|304/)' anonimizado.access.log | awk '{print $9,$7}' | sort | uniq

-Imprime el campo 5 del documento anterior, lo ordena, omite las repeticiones (poniendo delante el
número de veces que se repite), las ordena en orden descendente e imprime las 10 primeras líneas.

cat anonimizado.access.log | awk '{print $5}' | sort | uniq -c | sort -nr | head -10

Resultado:

-Imprimir el sexto campo de las líneas del documento anterior, ordenar, omitir repeticiones, ordenar
de forma opuesta al alfabeto e ignorando mayúsculas, y mostrar las primeras 200 líneas.

awk -F\" '{print $6}' anonimizado.access.log | sort | uniq -c | sort -fr | head -200

-Seleccionar aquellas líneas del documento anterior cuyo sexto campo esté vacío, imprimir el primer
campo, ordenarlo y omitir repeticiones:

awk -F\" '($6 ~ /^-?$/)' anonimizado.access.log | awk '{print $1}' | sort | uniq

-Imprimir el cuarto campo de aquellas líneas del documento anterior cuyo segundo campo sea
“\.(jpg|gif)” y cuyo cuarto campo no empiece por “https:\/\/ejemplo\.es”, después ordenarlo, omitir
repeticiones y volver a ordenarlo:

awk -F\" '($2 ~ /\.(jpg|gif)/ && $4 !~ /^https:\/\/ejemplo\.es/){print $4}' anonimizado.access.log |


sort | uniq -c | sort

-Buscar aquellas líneas del documento anterior que contengan “AdminLogin”, imprimir el primer
campo, ordenarlo, omitir repeticiones (poniendo delante el número de veces que se repite) y
ordenarlo de forma descendente:

grep AdminLogin anonimizado.access.log | awk '{print $1}' | sort | uniq -c | sort -nr

También podría gustarte