Я не могу вывести сумму двух столбцов из живого потока данных с помощью awk.

Вопрос или проблема

Я пытаюсь мониторить, сколько полосы пропускания используется Transmission во время скачивания торрентов. Я нашел утилиту nethogs. Если я запускаю

 sudo nethogs -t | grep transmission-gtk 

я получаю

transmission-gtk/2766/1001  0.145703    2.56738
transmission-gtk/2766/1001  0.606641    11.9141
transmission-gtk/2766/1001  1.06953 20.6506
transmission-gtk/2766/1001  1.87441 35.0754
transmission-gtk/2766/1001  2.63965 49.8998
transmission-gtk/2766/1001  2.76406 51.4779
transmission-gtk/2766/1001  3.49121 62.7377
transmission-gtk/2766/1001  4.2791  79.4397
transmission-gtk/2766/1001  4.69922 86.7502
transmission-gtk/2766/1001  5.57695 104.648
transmission-gtk/2766/1001  5.58379 111.542
transmission-gtk/2766/1001  5.54961 109.8
transmission-gtk/2766/1001  5.55586 109.565
transmission-gtk/2766/1001  5.58281 106.428
transmission-gtk/2766/1001  5.90234 107.965
transmission-gtk/2766/1001  5.66777 101.533
transmission-gtk/2766/1001  5.52168 93.8941
transmission-gtk/2766/1001  5.20098 88.0832
transmission-gtk/2766/1001  4.57051 80.6463
transmission-gtk/2766/1001  4.23613 77.7107
transmission-gtk/2766/1001  4.10391 78.3896
transmission-gtk/2766/1001  3.96484 78.1943
transmission-gtk/2766/1001  4.09473 76.99
transmission-gtk/2766/1001  4.41582 79.4229
transmission-gtk/2766/1001  4.73984 83.9588
transmission-gtk/2766/1001  5.88789 100.991
transmission-gtk/2766/1001  5.10801 80.4992
transmission-gtk/2766/1001  5.22676 80.5789
transmission-gtk/2766/1001  5.1707  76.5184
transmission-gtk/2766/1001  5.37773 80.1029
transmission-gtk/2766/1001  5.7707  85.7389
transmission-gtk/2766/1001  7.11309 103.625
transmission-gtk/2766/1001  6.13027 88.0092
transmission-gtk/2766/1001  5.64004 84.7049
transmission-gtk/2766/1001  5.08203 81.7949
transmission-gtk/2766/1001  4.58223 80.7449
transmission-gtk/2766/1001  5.42402 100.62
transmission-gtk/2766/1001  4.66973 87.1572
transmission-gtk/2766/1001  5.11504 90.9414
transmission-gtk/2766/1001  5.67402 97.6721
transmission-gtk/2766/1001  6.14375 97.0371
transmission-gtk/2766/1001  5.71191 92.018
transmission-gtk/2766/1001  6.82676 111.715
transmission-gtk/2766/1001  6.61562 109.056
transmission-gtk/2766/1001  4.80723 82.7264
transmission-gtk/2766/1001  4.71523 83.9014
transmission-gtk/2766/1001  4.3041  80.1188
transmission-gtk/2766/1001  4.04277 81.1988

Однако, когда я запускаю

sudo nethogs -t | grep transmission-gtk |  awk  '{ print $2+$3; }'

изредка он начинает выдавать результат, но чаще всего нет никакого вывода. Что не так или что мне делать?

Я попытался поискать в интернете, и все говорят, что это будет работать. Я пробовал несколько вариантов awk, добавлял -e и { print ($1+$2); }, но это все равно не работает. Я запускал обе команды одновременно, но команда с awk не стабильна, а команда без него всегда работает.

Ответ или решение

Для того чтобы правильно использовать утилиты командной строки, такие как nethogs и awk, необходимо учитывать особенности работы с потоками данных и синхронизацией команд. Ваш вопрос касается проблем с выводом суммы двух столбцов при использовании awk в сочетании с grep, и я помогу вам разобраться в этой ситуации.

Во-первых, давайте рассмотрим вашу команду:

sudo nethogs -t | grep transmission-gtk | awk '{ print $2+$3; }'

Эта команда должна по идее работать, но существуют некоторые нюансы, которые могут влиять на стабильность её выполнения.

Возможные причины нестабильного результата

  1. Формат данных: Убедитесь, что данные действительно содержат необходимые поля. Если в каком-то из выводов nethogs не будет значений во втором или третьем столбцах (например, значения могут отсутствовать из-за ошибок в самом nethogs, отсутствия передачи данных и т. д.), то awk не сможет выполнить операцию сложения и вернет пустую строку.

  2. Синхронизация потоков: nethogs выводит данные в реальном времени. Если grep или awk временно не успевают обработать строку, она может быть потеряна, особенно если выходной поток данных слишком быстро обновляется.

  3. Пробелы и разделители: Убедитесь, что вывод nethogs формируется с ожидаемым количеством пробелов или табуляций между колонками. Это особенно важно, если вывод может меняться.

Рекомендации по решению проблемы

  1. Добавление отладки: Чтобы увидеть, что именно передается в awk, вы можете временно добавить вывод строки в запущенную команду:

    sudo nethogs -t | grep transmission-gtk | awk '{ print $0; print $2+$3; }'

    Это покажет строки, которые обрабатываются awk, и поможет понять, почему они не выводят ожидаемое значение.

  2. Фильтрация данных: Используйте awk как основной инструмент фильтрации и обработки данных, а не grep. Например, вы можете использовать awk для выборки только нужных строк с начальной фильтрацией:

    sudo nethogs -t | awk '/transmission-gtk/ { print $2 + $3; }'

    Это может повысить скорость обработки и уменьшить вероятность пропуска строк.

  3. Периодическое выполнение: Для стабильности вывода рассмотрите возможность применения утилиты watch для периодического выполнения команды, например:

    watch -n 1 "sudo nethogs -t | awk '/transmission-gtk/ { print \$2 + \$3; }'"

    Это будет запускать команду каждую секунду и отображать результаты в терминале.

  4. Создание скрипта: Если ваши требования становятся более сложными, рассмотрите создание bash-скрипта для обработки данных, что позволит более гибко контролировать, как данные обрабатываются и выводятся.

В результате, правильная организация работы с командами, использование возможностей awk для фильтрации и обработка данных, а также добавление отладочных инструментов помогут вам добиться стабильных и ожидаемых результатов при мониторинге использования полосы пропускания во время передачи данных через transmission-gtk.

Оцените материал
Добавить комментарий

Капча загружается...