[LINUX] Oreore grep

La commande grep n'est pas gentille

La commande "grep" qui recherche une chaîne dans un fichier. Je pense que c'est utilisé assez souvent, mais ce n'est pas très gentil. Il est trop doux et a tendance à être utilisé en combinaison avec la commande «trouver». Pour «trouver», cela a tendance à rendre la ligne de commande longue, donc j'ai pensé que je devrais la compléter avec un script shell.

Tout d'abord, décidez de l'état par défaut.

C'est pourquoi je vais le mettre en œuvre.

Traitement facultatif

En parlant de traitement des options dans bash, il s'agit de "get opts", mais l'un des inconvénients est que "les options ne peuvent pas être spécifiées après des arguments autres que des options". Cependant, lorsque getopts propose une option non valide, il arrête simplement le traitement et il est correctement stocké dans l'argument option. Alors

  1. Utilisez getopts pour exécuter une boucle et effectuer un traitement facultatif
  2. A la sortie de la boucle, "décale" du nombre d'arguments traités (pas du nombre d'options) Cependant, si aucune option n'est spécifiée avant l'argument non-option, ce nombre est "0", donc une seule est "décalée".
  3. Extrayez "$ 1" comme argument
  4. Si "$ 1" est vide, le traitement des options se termine

Sous la forme de, vous pouvez mélanger des options et des arguments sans option.

Répertoire cible

Lorsque grep, la plupart des fichiers du répertoire sont ciblés, spécifiez donc essentiellement le fichier comme "" (caractère générique). Si aucun répertoire n'est spécifié, le répertoire courant "" est ciblé, et si un répertoire est spécifié, ce répertoire "*" est ciblé. Cependant, comme il est pratique de ne pouvoir spécifier que le type de fichier, nous avons rendu possible la spécification de "l'extension".

scénario

Et voici le résultat.

#!/usr/bin/env bash

CMD=`basename $0`

#=============================================================================
# error handler
#La gestion des erreurs
#=============================================================================
function error() {
  case ${1} in
    [12] )
      echo "Usage:"
      echo "$CMD [-r] [-e ext] [other grep option] search_string [search_directory]"
      echo "-r    : Recursive"
      echo "-e ext: Limits the search to files with the specified extension."
      echo ""
      ;;
    [34] )
      echo "require option parameter."
      echo ""
      ;;
    [5] )
      echo "invalid option - '${2}'"
      echo ""
      ;;
  esac
  exit
}

#=============================================================================
# option procedure
#Contrôle optionnel
#=============================================================================
function optproc() {
  local OPT OPTARG
  OPT=$1
  OPTARG=$2

  case $OPT in
    [e] )
      if [ -z "$OPTARG" ] || [ ${OPTARG:0:1} = "-" ]; then
        error 3
      else
        OPTION="$OPTION --include *.$OPTARG"
      fi
      ;;
    [r] )
      RECURSIVE="-R"
      TARGET=""
      ;;
    [C] )
      if [ -z "$OPTARG" ] || [ ${OPTARG:0:1} = "-" ]; then
        error 4
      else
        OPTION="$OPTION -C$OPTARG"
      fi
      ;;
    [\?] )
      error 5 $OPTARG
      ;;
    [:] )
      ;;
    * )
      OPTION="$OPTION -$OPT"
      ;;
  esac
}

#=============================================================================
# main procedure
#Traitement principal
#=============================================================================

#---------------------------
# exec without option
#Courir sans options
#---------------------------
if [ -z "${1}" ]; then
  error 1
fi

#---------------------------
# variable
#variable
#---------------------------
COMMAND="/usr/bin/env grep"
OPTION="--color=auto -Isn"
RECURSIVE=""
TARGET="*"
SEARCH=""

#---------------------------
# option loop
#Boucle optionnelle
#---------------------------
arg="-"
argarr=()

#---------------------------
# valid option
#Options valides
#---------------------------
option=":lvire:C:VcLo"
IFS=$'\n'

while [ ! -z $arg ]; do
  while getopts $option OPT; do
    optproc $OPT $OPTARG
  done

  num="$(($OPTIND-1))"
  shift $num
  arg=$1

  if [ ! -z "$arg" ]; then
    argarr+=($arg)
    OPTIND=1
    shift
  fi

done

SEARCH=${argarr[0]}
if [ -z $SEARCH ]; then
  error 4
fi
num=${#argarr[*]}
DIRTMP=""
for i in $(seq $num); do
  argstr=${argarr[$i]}
  if [ ! -z "$argstr" ]; then
    DIRTMP="$DIRTMP $argstr"
  fi
done

IFS=$'  '

if [ ! -z "$DIRTMP" ]; then
  DIRECTORY=${DIRTMP%/}
  TARGET="$DIRECTORY/$TARGET"
fi

$COMMAND $SEARCH $RECURSIVE $OPTION $TARGET

Il est assez polyvalent, veuillez donc l'utiliser comme modèle pour les scripts shell.

Recommended Posts

Oreore grep
commande grep
Origine de grep