Ejercicios de Shell Scripting en Bash: conteo de archivos, filtrado de líneas y usuarios inactivos

Enviado por Comunidad Wikiteka y clasificado en Informática

Escrito el en español con un tamaño de 4,98 KB
Actualizado el

Resumen

El documento presenta tres ejercicios prácticos de Shell Scripting en Bash orientados a la automatización de tareas y la administración de sistemas Linux. Incluye un script para contar archivos y directorios del directorio actual, otro para filtrar líneas que empiezan por vocal con validaciones de argumentos y un tercero para listar usuarios inactivos usando finger. Cada ejercicio añade su objetivo, el código propuesto y una explicación.

Puntos clave

  • El primer ejercicio cuenta archivos y directorios del directorio actual con test -f y test -d y guarda el resultado en el archivo cantidad_archivos.
  • El segundo ejercicio valida que se reciban dos argumentos que sean archivos y que el de entrada no esté vacío antes de filtrar.
  • El filtrado de líneas por vocal inicial usa grep -i "^[aeiou]", que ignora mayúsculas y minúsculas.
  • Los usuarios inactivos son aquellos con entrada en /etc/passwd que nunca han iniciado sesión, y finger muestra "Never logged in." para ellos.
  • El tercer ejercicio obtiene los nombres de usuario con cut -f 1 -d : /etc/passwd y comprueba cada uno con finger y grep.

Resumen generado con IA a partir del documento. Ponte a prueba

Ejercicios de Shell Scripting Avanzado

A continuación, se presentan una serie de ejercicios prácticos de Shell Scripting, diseñados para fortalecer las habilidades en la automatización de tareas y la administración de sistemas Linux. Cada ejercicio incluye una descripción detallada y una propuesta de solución en Bash.


1. Conteo de Archivos y Directorios en el Directorio Actual

Objetivo: Escribir un Shell script que permita registrar en un archivo llamado cantidad_archivos cuántos archivos y cuántos directorios hay en el directorio actual de trabajo. (20 puntos)

Script Propuesto:

#!/bin/bash

clear

cant_archivos=0
cant_directorios=0

for archivo in *
do
    if test -f "$archivo"
    then
        cant_archivos=$(echo "$cant_archivos+1" | bc)
    elif test -d "$archivo"
    then
        cant_directorios=$(echo "$cant_directorios+1" | bc)
    fi
done

echo "Cantidad de archivos: $cant_archivos" > cantidad_archivos
echo "Cantidad de directorios: $cant_directorios" >> cantidad_archivos

Explicación: Este script itera sobre todos los elementos (archivos y directorios) en el directorio actual. Utiliza test -f para identificar archivos regulares y test -d para identificar directorios. Los contadores se incrementan y, finalmente, los resultados se guardan en el archivo cantidad_archivos.


2. Filtrado de Líneas por Vocal Inicial en Archivos

Objetivo: Escribir un script Shell que permita recibir dos archivos como argumentos. El script debe validar que los parámetros recibidos sean realmente archivos y que el primer archivo (archivo de entrada) no esté vacío. Luego, deberá guardar en el otro archivo (archivo de salida) las líneas que comienzan con una vocal (mayúscula o minúscula) del archivo de entrada. (25 puntos)

Script Propuesto:

#!/bin/bash

clear

# Validar que se recibieron dos argumentos
if [ "$#" -ne 2 ]; then
    echo "Uso: $0 <archivo_entrada> <archivo_salida>"
    exit 1
fi

ARCHIVO_ENTRADA="$1"
ARCHIVO_SALIDA="$2"

# Validar que ambos argumentos son archivos
if test -f "$ARCHIVO_ENTRADA" && test -f "$ARCHIVO_SALIDA"; then
    # Validar que el archivo de entrada no está vacío
    if test -s "$ARCHIVO_ENTRADA"; then
        # Filtrar líneas que comienzan con una vocal (mayúscula o minúscula)
        grep -i "^[aeiou]" "$ARCHIVO_ENTRADA" > "$ARCHIVO_SALIDA"
        echo "Líneas filtradas guardadas en '$ARCHIVO_SALIDA'."
    else
        echo "Error: El archivo de entrada '$ARCHIVO_ENTRADA' está vacío."
        exit 1
    fi
else
    echo "Error: Ambos argumentos deben ser archivos válidos."
    echo "Asegúrese de que '$ARCHIVO_ENTRADA' y '$ARCHIVO_SALIDA' existen y son archivos."
    exit 1
fi

Explicación: Este script realiza varias validaciones antes de procesar los archivos. Primero, verifica que se hayan proporcionado dos argumentos. Luego, comprueba que ambos argumentos corresponden a archivos existentes y que el archivo de entrada no está vacío. Finalmente, utiliza grep -i "^[aeiou]" para encontrar y extraer las líneas que comienzan con una vocal (ignorando mayúsculas/minúsculas) y las redirige al archivo de salida.


3. Identificación de Usuarios Inactivos en el Sistema

Contexto: Todas las cuentas de usuarios poseen una entrada en el archivo /etc/passwd, aún cuando algunos de estos usuarios nunca hayan llegado a abrir una sesión. A estos usuarios los llamaremos “usuarios inactivos”. Si un usuario es inactivo, el comando finger mostrará “Never logged in.”

Ejemplo de Salida del Comando finger:

# finger alumno
Login: alumno Name: Alumno DUOC UC
Directory: /home/alumno Shell: /bin/bash
Never logged in.
No mail.
No Plan.

Objetivo: Escribir un Shell script que permita listar los usuarios inactivos del sistema al momento de la ejecución del script. (25 puntos)

Script Propuesto:

#!/bin/bash

clear

# Iterar sobre cada usuario listado en /etc/passwd
for USUARIO in $(cut -f 1 -d : /etc/passwd)
do
    # Ejecutar finger para el usuario y buscar la cadena "Never logged in."
    finger "$USUARIO" | grep -i "Never logged in."
    
    # Si grep encuentra la cadena (código de salida 0), el usuario es inactivo
    if test $? -eq 0
    then
        echo -e "$USUARIO es un usuario inactivo\n"
    fi
done

Explicación: El script extrae la lista de nombres de usuario del archivo /etc/passwd utilizando cut. Para cada usuario, ejecuta el comando finger y filtra su salida con grep -i "Never logged in.". Si grep encuentra la frase (indicado por un código de salida de 0), el script imprime que el usuario es inactivo.

Preguntas frecuentes

¿Cómo se identifica un usuario inactivo en Linux según este documento?

Un usuario inactivo tiene una entrada en /etc/passwd pero nunca ha abierto sesión. El comando finger muestra la frase "Never logged in." para estos usuarios.

¿Qué hace grep -i "^[aeiou]" en el segundo script?

Selecciona las líneas que comienzan con una vocal, mayúscula o minúscula, gracias a la opción -i que ignora la diferencia entre mayúsculas y minúsculas.

Ponte a prueba

Tarjetas de repaso

Pulsa una tarjeta para ver la respuesta.

Test

1. ¿Qué comando se usa en el primer script para identificar directorios?
2. ¿Qué valida el segundo script antes de filtrar las líneas?
3. ¿Qué significa la frase "Never logged in." en la salida de finger?
4. ¿De qué archivo extrae el tercer script los nombres de usuario?
5. ¿Dónde guarda sus resultados el primer script?

Preguntas generadas con IA a partir del documento: comprueba las respuestas con el texto.