одно и то же соответствует разным отпечаткам с помощью grep

Зависит от того, как настроен ваш crontab -для запуска фактической задачи или вызова сценария оболочки, который затем запускает вашу фактическую задачу.

В любом случае, если будет сгенерирован какой-либо вывод (stdout или stderr ), он будет отправлен по электронной почте. Единственный способ обойти это — перенаправить вывод в /dev/null или в файл журнала. Вы можете прочитать о перенаправлении ввода-вывода

.

0
23.07.2019, 04:00
2 ответа

ТРФ:

$ grep -Pom1 'Transferred:.*/ \K[^,]*' "$logfile"
577.080 MBytes
  • -Pвключить perl -совместимые регулярные выражения и \Kне включать элементы до \Kв согласованный вывод
  • -oвыводить только совпадающие части строки
  • -m1выйти после первой совпадающей строки, чтобы исключить вторую Transferred:строку

ТРС:

$ grep -Po 'Transferred:[^,]*,[^,]*, \K[^,]*' "$logfile"
12.660 MBytes/s
  • аналогично TRF :получить все, что следует за второй запятой + пробел, который не является запятой
  • здесь -m1не нужно, так как шаблон содержит более одной запятой

ОШИБКА:

$ grep -Po 'Errors:[[:space:]]*\K.*' "$logfile"
0
  • получить только цифры в конце строки, убрать пробелы

ТИМ:

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

Количество переданных файлов:(это первое из двух чисел)

$ grep -Po 'Transferred:[[:space:]]*\K[0-9]+(?= /)' "$logfile"
2
  • (?= /)— это положительный прогноз (PCRE ), где мы ищем пробел и /. Эта часть, как и \K, не включается в совпадающий вывод и необходима, чтобы не совпадать с первой строкой Transferred.
0
28.01.2020, 03:25

Этот подход создает всю строку вывода только с одним процессом. Следовательно, это должно быть намного быстрее, чем использование серии 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 
0
28.01.2020, 03:25

Теги

Похожие вопросы