2016-04-23 9 views
2

さて、さまざまなログファイルをさまざまな列と値で解析するためのスクリプトがあります。私はgetoptsを使用して、スクリプトが1つのディレクトリ内のファイルに対して解析を実行し、出力を別のディレクトリに保存できるようにしています。基本的にコマンドは(あるべき)である:現在getoptsを使用したBashスクリプト - 引数としてディレクトリを使用してください

./script.sh -i /absolute/input/dir/ -o /absolute/output/dir/ 

、スクリプトはログファイルとディレクトリにある場合、それは

がオンベース、各ファイルの最初の4と最後の4をチェックしますこれらの結果は特定の方法でファイルを解析し、 は割り当てられた出力ディレクトリに変更を出力し、 は次のファイルに移動して終了します。

ここで、スクリプトをログディレクトリの外に移動すると、ファイルに対して何らかの操作を実行できないようです。ここで

は、私のコードの例です:

#!/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 

は、だから私は、for文の中に($indir$f instead of $fを)$indir変数を使用して試してみましたが、それは動作しませんでした。私がecho $fなら、ディレクトリ内のすべてのファイルを見ることができますが、スクリプトは何もしません。

つまり、編集するファイルが入っている入力ディレクトリと、保存する編集したファイルの出力ディレクトリを指定するためにgetoptsを使いたいとします。

思考?

+0

'indir = "$ OPTARG"。 cd "$ indir"; ....? \ n "<$ indir/$ f'のように、dirとファイルの間に'/'を追加する必要があります。 '$ outdir/$ f'と同じです。がんばろう。 – shellter

答えて

1

私は問題がこれであると信じて:

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

fはパスが含まれている場合、あなただけのファイル名、パス全体からではないトリミングしているので、これが本当のことはありません:

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

ここfor f in *.log...から始まる、修正です:

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

あなたはどこにそれを挿入するのに最適な場所をお勧めしますか? 'for * in * .log"またはbeforeとsubsetの代わりに 'for f'?私は今では私のスクリプトを持っているマシンではないので、私はそれを検証するためにテストすることはできません。私は明日あなたに知らせます。 awkについては、私はawkが問題ではないことを知っているので、それをむちゃくちゃに投げただけです。それは私が使用している実際のawkではありません:) – Fetch

+0

それを置く場所を明確に:) – webb

+0

完璧に働いた!私の友人の助けをありがとう! – Fetch

関連する問題