Encontrar archivos y texto: Find y Grep
Sabés que hay un archivo con un problema en algún lado, pero no cuál. Aprendé a buscar por nombre con find y por contenido con grep.
Antes de empezar necesitás
- Una terminal Linux o WSL
- Haber hecho el lab de filesystem real
Al terminar vas a poder
- Distinguir búsqueda por nombre (find) de búsqueda por contenido (grep)
- Buscar archivos por nombre, patrón y tipo con find
- Buscar texto en uno o varios archivos con grep
- Usar -n para ubicar la línea y -i para ignorar mayúsculas
Entorno listo con Podman
Un servidor de juguete con cientos de líneas de log, donde una sola explica la caída del worker. lab-check revisa tus find y grep, el archivo culpable y el reto BUSCARME.
# Una vez: cloná el repo y construí la imagen
git clone https://github.com/ValentinTorassa/Open-Security-Labs.git
cd Open-Security-Labs
podman build -t osl/encontrar-archivos-y-texto -f entornos/linux-real/encontrar-archivos-y-texto/Containerfile entornos
# Abrí el entorno (se borra al salir)
podman run --rm -it --name osl-encontrar-archivos-y-texto --hostname labs osl/encontrar-archivos-y-texto
# Al terminar, adentro del contenedor
lab-checklab-checkrevisa lo que hiciste y guarda el resultado en/home/vt/evidencia. Desde otra terminal, en la carpeta del repo,npm run lab:check -- linux-real/encontrar-archivos-y-textocorre el mismo chequeo y copia tu evidencia aevidencia/encontrar-archivos-y-texto/.- ¿Usás Docker? Cambiá podman por docker en los comandos y funciona igual.
- Qué trae, qué revisa y sus límites: entornos/linux-real/encontrar-archivos-y-texto/README.md.
Sabés que hay un archivo con información que necesitás, pero no recordás el nombre ni dónde lo guardaste. O querés saber qué error ocurrió en un log, pero hay cientos de líneas. find y grep son las herramientas que usan los sysadmins todo el día para esto.
La diferencia es clara: find busca archivos por atributos (nombre, tipo). grep busca texto dentro de archivos.
Empecemos por lo básico
Creá una carpeta de práctica y un archivo adentro:
mkdir proyecto
cd proyecto
echo "Estas son mis notas" > notas.txt
echo "para linux real" >> notas.txt
find . -name "notas.txt"
grep "notas" notas.txt> crea el archivo y >> le agrega una línea al final. find te responde dónde está (./notas.txt). grep te responde qué dice: imprime la línea que contiene la palabra (Estas son mis notas).
Find: buscar archivos por nombre y tipo
Cuando no recordás dónde guardaste algo, find es tu respuesta.
# Sumá un segundo archivo y una subcarpeta con otro archivo
echo "Mis apuntes" > apuntes.txt
mkdir clases
echo "Practicar cuentas en linux" > clases/matematicas.txt
# Buscar todos los .txt desde la carpeta actual
find . -name "*.txt"
# Solo archivos (no directorios)
find . -type f
# Solo directorios
find . -type dEntendamos la sintaxis:
find .= buscar desde acá (.= carpeta actual) y en todas sus subcarpetas-name "*.txt"= archivos cuyo nombre termine en.txt-type f= solo archivos-type d= solo directorios
Tu carpeta quedó así:
proyecto/
├─ notas.txt
├─ apuntes.txt
└─ clases/
└─ matematicas.txt
find . -name "*.txt" te devuelve los tres archivos, incluido ./clases/matematicas.txt, aunque esté dentro de una subcarpeta: find entra solo a cada carpeta que encuentra. find . -type f te da lo mismo, porque acá todos los archivos son .txt. find . -type d devuelve . (la carpeta actual) y ./clases. El orden puede variar en tu máquina.
Grep: buscar texto dentro de archivos
Ya encontraste un archivo (o varios). Ahora querés saber si contiene la palabra que buscás.
# Buscar una palabra que no está en el archivo
grep "error" notas.txt
# Buscar una palabra que sí está
grep "linux" notas.txt
# Buscar en varios archivos
grep "linux" *.txt
# Mostrar el número de línea
grep -n "linux" notas.txt
# Ignorar mayúsculas
grep -i "Linux" notas.txt
# Buscar recursivamente en carpetas
grep -r "linux" .La sintaxis:
grep "patrón" archivo= buscar el patrón en ese archivo-n= mostrar el número de línea-i= ignorar mayúsculas (ERROR, Error y error son iguales)-r= recursivo (buscar en la carpeta y sus subcarpetas)
Output: las líneas que contienen lo que buscás.
$ grep "linux" notas.txt
para linux real
$ grep "linux" *.txt
notas.txt:para linux real
$ grep -n "linux" notas.txt
2:para linux real
$ grep -r "linux" .
./clases/matematicas.txt:Practicar cuentas en linux
./notas.txt:para linux real
Fijate cuatro cosas:
grep "error" notas.txtno devuelve nada: si no hay coincidencias, grep no imprime ningún mensaje. Que no salga nada también es una respuesta.- grep distingue mayúsculas:
grep "Linux" notas.txtno encuentra nada, porque el archivo dicelinux. Congrep -i "Linux" notas.txtsí aparece la línea. - Cuando buscás en varios archivos (con
*.txto con-r), grep antepone el nombre del archivo a cada línea, así sabés en cuál está la coincidencia.grep "linux" *.txtrevisóapuntes.txtynotas.txt, pero solo muestranotas.txtporque es el único que contiene la palabra. *.txtsolo mira la carpeta actual: no entra aclases/, por eso no encuentramatematicas.txt.grep -r "linux" .recorre también las subcarpetas y encuentra los dos. Si buscás algo y no sabés en qué carpeta está, usá-r.
Lo que practicás en este lab
Llevátelo a tu repo si querés, pero no es obligatorio: es tu aprendizaje.
- Salida de find y grep guardada en un archivo de evidencia
- Writeup corto: qué encontraste, dónde y con qué comando
Reto
Creá un archivo de texto con una palabra especial (por ejemplo BUSCARME), salí de esa carpeta, localizalo por nombre con find y confirmá con grep que el archivo contiene la palabra. Guardá los comandos y la salida en evidencia.txt.
Resolvelo y escribí dos líneas explicando qué pasó. Con eso lo fijás.