2016-04-23 5 views
2

Итак, у меня есть сценарий, который я использую для разбора различных файлов журнала с разными столбцами и значениями. Я пытался использовать getopts, чтобы позволить моему скрипту запускать разбор по файлам в одном каталоге и сохранять вывод в другой каталог. По существу команда (должно быть):Bash Script с использованием getopts - использовать каталог как аргумент

./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 

Так что я попытался использовать переменную $indir внутри для оператора ($indir$f instead of $f), но это не сработало. Если я echo $f, то я могу увидеть все файлы в каталоге, но сценарий просто ничего не сделает.

Короче говоря, я хочу использовать getopts, чтобы указать каталог ввода, который содержит файлы для редактирования, и выходной каталог для отредактированных файлов, которые будут сохранены.

Мысли?

+0

'INDIR = "$ Optarg"; cd "$ indir"; .... '? Или лучше иметь код, чтобы добавить '/' между dir и файлом, т. Е. 'Tr -cd '[: print:] \ n" <$ indir/$ f'? То же самое для '$ 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 f в * .log' или перед и подмножество' for f'? Я не на машине, у меня есть мой скрипт прямо сейчас, поэтому я не могу проверить это, чтобы проверить. Я дам вам знать завтра. Что касается awk, я просто бросил это вяло, потому что я знаю, что awk не проблема. Это не фактический awk, который я использую :) – Fetch

+0

уточнил, где его поставить :) – webb

+0

Работал отлично! Спасибо за помощь моему другу! – Fetch