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一致してはいけません。

おすすめ記事