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.
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
In Form von können Sie Optionen und Nichtoptionsargumente mischen.
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.
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.