Этот подход создает всю строку вывода только с одним процессом. Следовательно, это должно быть намного быстрее, чем использование серии 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
, сохраните второе поле в mb
и седьмое и восьмое поля в speed
.
/Errors/{err=$2}
Если эта строка содержит Errors
, то сохраните второе поле в err
.
/Transferred/{n=$2}
Если эта строка содержит Transferred
, сохраните второе поле в переменной 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