変数(主にディレクトリ)に渡され、2つの異なるプログラムを実行するbash構成ファイルに関数を作成しようとしています。変数は通常次のとおりです~/logdirectory/*.log
。私の.txtファイルには約25個のファイルがあります/logdirectory/
。コマンドラインから関数の各行を実行すると、期待どおりに実行されます。
最初の行はコマンドラインから25個のファイルすべての結果を返すPythonスクリプトを実行しますが、関数内で実行すると1つのファイル(ディレクトリの最初のファイル)の結果のみが返されます。
2行目は、同じログファイルセットを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
使用)を使用するときは、二重引用符を使用することを忘れないでください。"$1"
$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スクリプトの3つのブロックは{}
1つにまとめることができ、改行またはセミコロンで区切ることができます。条件がなければ、常にすべての入力ラインに対して実行されるため、別々のブロックにする必要はありません。
それが何をしているのplotman
かわからないので、コマンドラインで複数のファイル名引数を処理するとします。一度に1つのファイル名しか使用できない場合は、このコマンドで「$ @」を使用する代わりにforループでラップしてください。例えば
for f in "$@" ; do
plotman analyze "$f"
done