
以前は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
-P
Perl準拠の正規表現を有効にし、一致する出力に以前の\K
内容を含めません。\K
-o
その行の一致部分のみ出力-m1
Transferred:
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番目のフィールドをに保存し、mb
7番目と8番目のフィールドをに保存しますspeed
。/Errors/{err=$2}
行にが含まれている場合は、
Errors
2番目のフィールドをに保存しますerr
。/Transferred/{n=$2}
行にが含まれている場合は、
Transferred
2番目のフィールドを変数に保存します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