grepのような一致他の印刷

grepのような一致他の印刷

以前はgrepに関して貴重な助けを得ましたので、これも理解できることを願っています。

これはRcloneログからのものです。

Transferred:      577.080M / 577.080 MBytes, 100%, 12.660 MBytes/s, ETA 0s
Errors:                 0
Checks:                 2 / 2, 100%
Transferred:            2 / 2, 100%
Elapsed time:       45.5s

私がやりたいことは、カスタムテキストで電子メール通知を作成することです。 「577MB転送、エラーのないファイル2個を45.5秒@12,660MB/sで転送」のようなものです。

したがって、これを機能させるには、この値を印刷する必要があります。私は以前の方法に従ってみましたが、成功しませんでした。ログから2回送信し、それを分割してTRF = 577.080MbytesおよびTRS = 12.660 MBytes / sを取得する方法

TRF=$(grep -o 'Transferred:.*' $logfile| cut -d\   -f4)
ERR=$(grep -o 'Errors:.*' $logfile | cut -d\   -f4)
TIM=$(grep -o 'Elapsed time:.*' $logfile | cut -d\   -f3-)
TRS=$(grep -o 'Transferred:.*' $logfile | cut -d\   -f4)

答え1

伝達因子:

$ grep -Pom1 'Transferred:.*/ \K[^,]*' "$logfile"
577.080 MBytes
  • -PPerl準拠の正規表現を有効にし、一致する出力に以前の\K内容を含めません。\K
  • -oその行の一致部分のみ出力
  • -m1Transferred:2行目を除外するには、最初の一致行の後に終了します。

TRS:

$ grep -Po 'Transferred:[^,]*,[^,]*, \K[^,]*' "$logfile"
12.660 MBytes/s
  • TRFに似ています:2番目のカンマの後のすべてのエントリ+コンマ以外のスペースを取得します。
  • -m1パターンに複数のカンマが含まれているため、これは必要ありません。

よく:

$ grep -Po 'Errors:[[:space:]]*\K.*' "$logfile"
0
  • 行末の数字のみを取得し、空白文字を削除します。

チーム:

$ grep -Po 'Elapsed time:[[:space:]]*\K.*' "$logfile"
45.5s

転送されたファイル数:(これは2つの数字の最初です)

$ grep -Po 'Transferred:[[:space:]]*\K[0-9]+(?= /)' "$logfile"
2
  • (?= /)は肯定的な予測(PCRE)なので、スペースを探しています/。この部分は\K一致する出力に含まれていないものと同じで、最初の行がTransferred一致してはいけません。

答え2

この方法は、単一のプロセスのみを使用して完全な出力ラインを生成します。したがって、一連のgrepとcutを使用するよりもはるかに高速です。また、awkは非常に強力なので(たとえば、浮動小数点計算を実行することができます)、後で出力を向上させるのに役立ちます。

努力する:

$ awk '/ETA/{mb=$2; speed=$7" "$8} /Errors/{err=$2} /Transferred/{n=$2} /Elapsed/{printf "Transferred %s, %s files with %s errors in %s @ %s\n",mb,n,err,$3,speed}' rclone.log 
Transferred 577.080M, 2 files with 0 errors in 45.5s @ 12.660 MBytes/s,

どのように動作しますか?

  • /ETA/{mb=$2; speed=$7" "$8}

    現在行にETAが含まれている場合(つまり、最初のTransferred行)、2番目のフィールドをに保存し、mb7番目と8番目のフィールドをに保存しますspeed

  • /Errors/{err=$2}

    行にが含まれている場合は、Errors2番目のフィールドをに保存しますerr

  • /Transferred/{n=$2}

    行にが含まれている場合は、Transferred2番目のフィールドを変数に保存しますn

  • /Elapsed/{printf "Transferred %s, %s files with %s errors in %s @ %s\n",mb,n,err,$3,speed}'

    最後に含まれている行に達すると、Elapsedメッセージを印刷します。

複数行バージョン

コードを複数行にわたって分散したい場合:

awk '
/ETA/{
    mb=$2
    speed=$7" "$8
}
/Errors/{
    err=$2
}
/Transferred/{
    n=$2
}
/Elapsed/{
    printf "Transferred %s, %s files with %s errors in %s @ %s\n",mb,n,err,$3,speed
}' rclone.log 

関連情報