Bash 使用 getopts 的脚本 - 使用目录作为参数
Bash Script using getopts - use directory as argument
好的,我已经有了一个脚本,我用它来解析具有不同列和值的各种日志文件。我一直在尝试使用 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
所以我尝试在 for 语句 ($indir$f instead of $f
) 中使用 $indir
变量,但这没有用。如果我 echo $f
那么我可以看到目录中的所有文件,但脚本不会执行任何操作。
总之,我想用getopts指定一个输入目录,其中包含要编辑的文件,以及输出目录,用于保存编辑后的文件。
想法?
我认为问题在于此:
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)
好的,我已经有了一个脚本,我用它来解析具有不同列和值的各种日志文件。我一直在尝试使用 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
所以我尝试在 for 语句 ($indir$f instead of $f
) 中使用 $indir
变量,但这没有用。如果我 echo $f
那么我可以看到目录中的所有文件,但脚本不会执行任何操作。
总之,我想用getopts指定一个输入目录,其中包含要编辑的文件,以及输出目录,用于保存编辑后的文件。
想法?
我认为问题在于此:
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)