2016-04-23 18 views
2

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?

+0

'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

Antwort

1

Ich glaube, das Problem dabei ist:

f4l4="${f:0:4}${f:${#f}-4}" 

Wenn f den Pfad enthält, dann sind Sie aus dem ganzen Weg Trimmen, nicht nur die Dateinamen, so ist dies nie wahr:

[[ "${f4l4}" = "this.log" ]] 

Hier ist eine Lösung, bei for f in *.log... Start:

for p in $indir*.log ## <-- change "for f in *.log" to this 
do 
    f=`basename "$p"` ## <-- new 
    ... 
    if [[ "${f4l4}" = "this.log" ]]; then 
    tr -cd "[:print:]\n" < $p ## <-- change ($f to $p) 
    ... 
    elif [[ "${f4l4}" = "that.log" ]]; then 
    parse log file another way < $p ## <-- change ($f to $p) 
+0

Wo würden Sie den besten Platz zum Einfügen vorschlagen? Anstelle von 'for f in * .log' oder vorher und Teilmenge 'for f'? Ich bin nicht an der Maschine, auf der ich gerade mein Skript habe, damit ich es nicht testen kann. Ich werde es dich morgen wissen lassen. Was das awk betrifft, habe ich das einfach schlampig geworfen, weil ich weiß, dass das awk nicht das Problem ist. Es ist nicht das tatsächliche awk, das ich benutze :) – Fetch

+0

geklärt, wo man es setzt :) – webb

+0

Arbeitete perfekt! Danke für die Hilfe mein Freund! – Fetch