grep 在 .bashrc 函数中输出多个文件

grep 在 .bashrc 函数中输出多个文件

我试图在 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

相关内容