Okay, also ich habe ein Skript, mit dem ich verschiedene Protokolldateien mit verschiedenen Spalten und Werten analysieren. Ich habe versucht, getopts zu verwenden, um meinem Skript zu ermöglichen, das Parsing für die Dateien in einem Verzeichnis auszuführen, und die Ausgabe in einem anderen Verzeichnis zu speichern. Im Wesentlichen ist der Befehl (soll):Bash-Skript mit getopts - verwenden Sie Verzeichnis als Argument
./script.sh -i /absolute/input/dir/ -o /absolute/output/dir/
Derzeit, wenn das Skript in dem Verzeichnis mit den Protokolldateien ist, wird es
Prüfung des ersten 4 und letzte 4 von jeder Datei, basierend auf Diese Ergebnisse analysieren die Datei in einer bestimmten Weise, geben Sie die Änderungen an das zugewiesene Ausgabeverzeichnis aus, gehen Sie zur nächsten Datei über, , beenden Sie.
Jetzt, wenn ich das Skript außerhalb des Log-Verzeichnisses verschieben, kann ich nicht scheinen, um es auf die Dateien durchzuführen.
Hier ist ein Beispiel von meinem Code:
#!/bin/bash
while getopts ":i:o:" opt; do
case $opt in
i)
indir="$OPTARG"
;;
o)
outdir="$OPTARG"
;;
\?)
echo "invalid option"
exit 0
esac
done
shift $((OPTIND-1))
for f in *.log
do
shopt -s nocasematch
f4l4="${f:0:4}${f:${#f}-4}"
if [[ "${f4l4}" = "this.log" ]]; then
tr -cd "[:print:]\n" < $f | awk -F, 'BEGIN{OFS=FS}for(i=6,i<8;i++) $i=sprintf(%02X,$i)}1' > $outdir$f.csv
sed -i '1icolumn1,column2,column3,column4,5,6,7,8,etc' $outdir$f.csv
elif [[ "${f4l4}" = "that.log" ]]; then
parse log file another way < $f | sed this and that > $outdir$f.csv1
fi
done
So habe ich versucht, mit den $indir
Variable innerhalb der for-Anweisung ($indir$f instead of $f
), aber das hat nicht funktioniert. Wenn ich echo $f
dann kann ich alle Dateien im Verzeichnis sehen, aber das Skript wird nichts tun.
Kurz gesagt, ich möchte getopts verwenden, um ein Eingabeverzeichnis anzugeben, das die Dateien enthält, die bearbeitet werden sollen, und das Ausgabeverzeichnis für die bearbeiteten Dateien, die gespeichert werden sollen.
Gedanken?
'Development = "$ OPTARG"; CD "$ indir"; .... '? ODER besser, um Code zu haben, fügen Sie '/' zwischen dir und file hinzu, d. H. 'Tr -cd" [: print:] \ n "<$ indir/$ f'? Gleiches gilt für '$ outdir/$ f'. Viel Glück. – shellter