Я создал симпатичную небольшую команду для измерения потребления полосы пропускания данных через лимитное соединение (исключая локальный трафик):
sudo iftop -i enp1s0 -f 'not (src net (10 или 172.16 / 12 или 192.168 / 16) и dst net (10 или 172.16 / 12 или 192.168 / 16))' -t -L1 2> / dev / null | awk '$ 1 == "Накопительное" {print $ 5;}'
Если вы дадите ему некоторое время, вы увидите, что он начнет печатать строки с данными в байтах (я думаю, stdout).
Я пробовал много всего, пытаясь записать эти строки в файл, включая несколько вариантов 1>,>, >>, tee и др. Кажется, ничего не работает при перенаправлении вывода из awk.
Ваша проблема в том, что если awk обнаруживает, что его вывод не является терминалом, он переключается на буферизованный вывод; вам просто нужно подождать, пока не появится какой-либо вывод.
Если не хотите ждать, используйте:
sudo iftop -i enp1s0 -f 'not (src net (10 or 172.16/12 or 192.168/16) and dst net (10 or 172.16/12 or 192.168/16))' -t -L1 2> /dev/null | awk '$1 == "Cumulative" {print $5; fflush(); }'
(The fflush()
приведет к немедленной печати всех строк, что менее эффективно, но позволяет сразу увидеть это.)
Смешивание перенаправлений с sudo может сбивать с толку. Я бы запустил конвейер в новой оболочке, и перенаправление могло бы пойти туда:
sudo sh <<'END_IFTOP'
filter="not (src net (10 or 172.16/12 or 192.168/16) and dst net (10 or 172.16/12 or 192.168/16))"
iftop -i enp1s0 -f "$filter" -t -L1 2> /dev/null |
awk '$1 == "Cumulative" {print $5}' > $HOME/output.file
END_IFTOP