[LINUX] Oreore grep

Der Befehl grep ist nicht nett

Der Befehl "grep", der nach einer Zeichenfolge in einer Datei sucht. Ich denke, es wird ziemlich oft verwendet, aber es ist nicht sehr nett. Es ist zu sanft und wird in der Regel in Kombination mit dem Befehl "find" verwendet. Bei "find" wird die Befehlszeile in der Regel lang, daher dachte ich, ich sollte sie mit einem Shell-Skript vervollständigen.

Legen Sie zunächst den Standardstatus fest.

Deshalb werde ich es implementieren.

Optionale Verarbeitung

Apropos Optionsverarbeitung in Bash, es ist "get opts", aber einer der Nachteile ist, dass "Optionen nicht nach anderen Argumenten als Optionen angegeben werden können". Wenn getopts jedoch eine ungültige Option anzeigt, wird die Verarbeitung einfach gestoppt und ordnungsgemäß im Optionsargument gespeichert. Damit

  1. Verwenden Sie getopts, um eine Schleife auszuführen und eine optionale Verarbeitung durchzuführen
  2. Beim Verlassen der Schleife "verschieben" Sie um die Anzahl der verarbeiteten Argumente (nicht um die Anzahl der Optionen). Wenn jedoch vor dem Nichtoptionsargument keine Option angegeben wird, ist diese Zahl "0", sodass nur eine "verschoben" wird.
  3. Extrahieren Sie "$ 1" als Argument
  4. Wenn "$ 1" leer ist, endet die Optionsverarbeitung

In Form von können Sie Optionen und Nichtoptionsargumente mischen.

Zielverzeichnis

Bei grep werden die meisten Dateien im Verzeichnis als Ziel ausgewählt. Geben Sie die Datei daher grundsätzlich als "" (Platzhalter) an. Wenn kein Verzeichnis angegeben ist, wird das aktuelle Verzeichnis "" als Ziel angegeben, und wenn ein Verzeichnis angegeben wird, wird dieses Verzeichnis "*" als Ziel ausgewählt. Da es jedoch zweckmäßig ist, nur den Dateityp angeben zu können, haben wir es möglich gemacht, die "Erweiterung" anzugeben.

Skript

Und hier ist das Ergebnis.

#!/usr/bin/env bash

CMD=`basename $0`

#=============================================================================
# error handler
#Fehlerbehandlung
#=============================================================================
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
#Optionale Steuerung
#=============================================================================
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
#Hauptverarbeitung
#=============================================================================

#---------------------------
# exec without option
#Ohne Optionen ausführen
#---------------------------
if [ -z "${1}" ]; then
  error 1
fi

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

#---------------------------
# option loop
#Optionale Schleife
#---------------------------
arg="-"
argarr=()

#---------------------------
# valid option
#Gültige Optionen
#---------------------------
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

Es ist sehr vielseitig, verwenden Sie es also als Vorlage für Shell-Skripte.

Recommended Posts

Oreore grep
grep Befehl
Herkunft von grep