Я пытаюсь получить вывод команды
iperf -c 10.0.0.1 -t 3600 -i 2
И нужны только поля Интервал и пропускная способность, перечисленные для всего часа регистрации.
Я не использовал grep или awk много лет.
Помощь была бы классной!
Пример вывода:
------------------------------------------------------------
Client connecting to node2, TCP port 5001
TCP window size: 129 KByte (WARNING: requested 130 KByte)
------------------------------------------------------------
[ 3] local <IP Addr node1> port 2530 connected with <IP Addr node2> port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 19.7 MBytes 15.8 Mbits/sec
Желаемый результат:
0.0-10.0 15.8
Основываясь исключительно на ваших публикациях iperf
output, вы просто напечатаете поля 3 и 4 из последней строки:
| awk 'END{print $3" "$7}'
НО этот вопрос не просто о awk
.
Вопрос: Начнем с объяснения ваших iperf
команда делает это для тех, кто с ней не знаком.
-c 10.0.0.1
подключается к серверу, прослушивающему адрес 10.0.0.1
-t 3600
продолжает бежать за 3600
секунды, т.е. 1 час-i 2
печатает отчет каждые 2
секундыВ течение следующего часа каждые две секунды на экране выводится (добавляется) такая строка:
[ 3] 0.0-10.0 sec 19.7 MBytes 15.8 Mbits/sec
Вам нужно сократить информацию, выводимую на экран каждые две секунды, до строк формы:
0.0-10.0 15.8
Ответ: Чтобы получить это, вы передаете вывод в awk
:
iperf -c 10.0.0.1 -t 3600 -i 2 | awk '/[0-9]]/{sub(/.*]/,"");print $1" "$5}'
Вы можете перестать читать здесь, если у вас есть iperf
, то есть iperf 2.
Если вы используете iperf3
, вы уже должны были узнать, что вывод по конвейеру буферизируется. Это означает, что вы делаете не видеть новую строку, выводимую на экран каждые две секунды! Вместо этого каждые 50 секунд или около того, в зависимости от системы, печатается целый набор строк. Обратите внимание, что этого не происходит с iperf 2, потому что он сбрасывает вывод после печати каждой строки.
Чтобы строка желаемой формы выводилась на экран с нужным интервалом, необходимо: --forceflush
:
--forceflush force flushing output at every interval. Used to avoid buffer- ing when sending output to pipe.
Ответ:
iperf3 -c 10.0.0.1 -t 3600 -i 2 --forceflush | awk '/[0-9]]/{sub(/.*]/,"");print}'
Обратите внимание, что эта опция была добавлена в iperf3
версия 3.1.5
.