我试图在 bash 配置文件中创建一个函数,该函数将传入一个变量(主要是一个目录),并运行两个不同的程序。该变量通常类似于~/logdirectory/*.log
。我的 .txt 文件中有大约 25 个文件/logdirectory/
。当我在命令行上运行该函数的每一行时,它会按预期运行。
第一行运行一个 python 脚本,该脚本在命令行上将返回所有 25 个文件的结果,但是当我在函数中运行它时,它只返回 1 个文件的结果(目录中的第一个文件)
第二行应该 grep 中的同一组日志文件/logsdirectory/
,并查找应该在所有日志文件中的值,然后将所有结果通过管道传输awk
以对返回值进行一些数学运算。但是,与第一行非常相似,它仅返回目录中第一个文件的结果。有谁知道我缺少什么或可能需要做什么?我尝试过使用for
/do
循环的子函数来尝试让它工作,但没有成功。以下是我正在使用的功能。任何指导将不胜感激。谢谢!
plotstats() {
#take log directory and run plotman analyze
plotman analyze $1
grep -i "total time" $1 |awk '{sum=sum+$4} {avg=sum/NR} {tday=86400/avg*6*101.366/1024} END {printf "%d K32 plots, avg %0.1f seconds, %0.2f TiB/day \n", NR, avg, tday}'
}
答案1
使用"$@"
而不只是$1
.并记住在使用变量时用双引号(和 shell 位置参数 - 例如 use"$1"
而不是 unquoted )。$1
plotstats() {
#take log directory and run plotman analyze
plotman analyze "$@"
grep -h -i "total time" "$@" |
awk '{sum=sum+$4}
{avg=sum/NR}
{tday=86400/avg*6*101.366/1024}
END {printf "%d K32 plots, avg %0.1f seconds, %0.2f TiB/day \n", NR, avg, tday}'
}
顺便说一句,awk 脚本中的三个{}
块可以合并为一个,并用换行符或分号分隔。没有条件,它们总是会为每个输入行运行......所以不需要将它们作为单独的块。
我不知道它的plotman
作用是什么,所以我假设它可以在命令行上处理多个文件名参数。如果一次只能使用一个文件名,请将其包装在 for 循环中,而不是在此命令中使用“$@”。例如
for f in "$@" ; do
plotman analyze "$f"
done