grep は .bashrc 関数から複数のファイルを出力します。

grep は .bashrc 関数から複数のファイルを出力します。

変数(主にディレクトリ)に渡され、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

関連情報