#!/bin/bash

help() {
    echo "#> $(basename "${0}"): Busca un patrón en el archivo y muestra la línea donde se localizo junto a un número de lineas contexto de alrededor"
    echo ">> Se requiere indicar al menos el patrón de búsqueda. El resto de parámetros posibles:"
    echo -e "\t'-f': Ruta del fichero donde hacer la búsqueda"
    echo -e "\t      Por defecto: '*' # En todos los ficheros del directorio actual"
    echo -e "\t'-n': Número de líneas de contexto a mostrar"
    echo -e "\t      Por defecto: 5"
    echo -e "\t'-p': Patrón de búsqueda (no distingue mayúsculas y minúsculas, al incorporar la opción -i del grep)"
    echo -e "\t'-a': Cambia el contexto por defecto (mostrar las líneas de alrededor) para mostrar únicamente las de despueś"
    echo -e "\t'-b': Cambia el contexto por defecto (mostrar las líneas de alrededor) para mostrar únicamente las anteriores"
    echo -e "#> Uso: $(basename "${0}") [-f ruta_fichero] [-n nlineas] [-p patrón] [-a|-b]"
    exit 1
}

[[ -z "${1}" ]] && help

FICH='*'
CONTEXTO="-C" # Opción de contexto de grep, teniendo en cuenta las líneas de antes como las de después
NLINEAS="5" # Si no se indica lo contrario la líneas de contexto serán 5
while getopts :hp:n:f:ba OPT; do
    case "${OPT}" in
        f) FICH="${OPTARG}" ;;
        n) NLINEAS="${OPTARG}" ;;
        p) PATRON="${OPTARG}" ;;
        a) CONTEXTO="-A" ;;
        b) CONTEXTO="-B" ;;
        \?) help ;;
        :) help ;;
        h | *) help ;;
    esac
done

[[ ! "${PATRON}" ]] && \
echo "#> Error: Debes indicar al menos el patrón de búsqueda" && \
help

COMANDO=( "grep" "$CONTEXTO" "${NLINEAS}" --color=always -i "${PATRON}" "${FICH}" )
eval "${COMANDO[@]}"
