В настоящее время я использую следующую строку для расчета текущей скорости загрузки и выгрузки для моего Wi-Fi-соединения с именем wlp4s0:

awk '{if(l1){printf ("%.2f", ($2-l1)/1024/1024); print "MB/s"; printf ("%.2f", ($10-l2)/1024/1024); print "MB/s"} else {l1=$2; l2=$10;}}' <(grep wlp4s0 /proc/net/dev) <(sleep 1; grep wlp4s0 /proc/net/dev)

Вывод этой команды, например:

1,85МБ / с 0,2МБ / с

Затем я использую вторую команду для расчета загрузки и выгрузки НО для Ethernet на этот раз вместо Wi-Fi:

awk '{if(l1){printf ("%.2f", ($2-l1)/1024/1024); print "MB/s"; printf ("%.2f", ($10-l2)/1024/1024); print "MB/s"} else {l1=$2; l2=$10;}}' <(grep enp3s0 /proc/net/dev) <(sleep 1; grep enp3s0 /proc/net/dev)

Вывод этой команды аналогичен первой, например:

1,35 МБ / с 0,1 МБ / с

Вопрос . Как можно объединить эти два оператора awk, чтобы получить только один вывод с добавленными значениями? Желаемый результат должен быть:

3,20 МБ / с 0,3 МБ / с

Таким образом, оба загружаемых значения добавляются (1,85 + 1,35) и одинаковы для загрузки (0,2 + 0,1).

Он подумал, что может быть лучше сначала добавить значения и добавить «МБ / с» в качестве последнего шага. Будет ли это лучший подход?

awk
0
tschoninas 22 Июл 2020 в 20:23

3 ответа

Лучший ответ

Как то так должно работать, но не проверено.

$ awk 'function pr(x) {printf "%.2f %s\n", x/1024/1024,"MB/s"}  
       /wlp4s0/ && !w++ {wf2=$2; wf10=$10}
       /enp3s0/ && !e++ {ef2=$2; ef10=$10}                    
       /wlp4s0/ && w==2 {pr($2-wf2); pr($10-wf10); w=0}
       /enp3s0/ && e==2 {pr($2-ef2); pr($10-ef10); e=0}' <(cat /proc/net/dev) <(sleep 1; cat /proc/net/dev)

Захватите первое вхождение значений и выведите масштабированную разницу во втором вхождении.

Возможно, объединение двух условий в одно, если / еще будет лучше ...

1
karakfa 23 Июл 2020 в 14:20

Это sleep в замене процесса довольно мило, я не думаю, что видел это раньше.

Вот как я подхожу к этому (не проверено):

file='/proc/net/dev'
tmp=$(mktemp) &&
cp -- "$file" "$tmp" &&
sleep 1 &&
awk '
    /wlp4s0/ { vals["wifi","dn",NR==FNR] = $2; vals["wifi","up",NR==FNR] = $10 }
    /enp3s0/ { vals["ethr","dn",NR==FNR] = $2; vals["ethr","up",NR==FNR] = $10 }
    END {
        split("wifi ethr", cons)
        split("dn up", dirs)
        for (i=1; i in cons; i++) {
            con = cons[i]
            for (j=1; j in dirs; j++) {
                dir = dirs[j]
                val = (vals[con,dir,0] - vals[con,dir,1])/1024/1024)
                printf "%s %s %.2f MB/s\n", con, dir, val
                tot[dir] += val
            }
        }
        for (j=1; j in dirs; j++) {
            printf "%s %.2f MB/s\n", dir, tot[dir]
        }
    }
' "$tmp" "$file" &&
rm -f "$tmp"

Форматирование окончательного вывода оставлено в качестве упражнения :-).

0
Ed Morton 23 Июл 2020 в 04:04

Учитывая размер /proc/net/dev и его относительно быстрый анализ, вы можете написать короткий сценарий для мониторинга всех названных интерфейсов и на терминале, совместимом с VT100, чтобы создать небольшой симпатичный динамически обновляемый блок информации, показывающий скорость передачи для каждый из которых использует ANSI.

Сценарий использует значение времени ожидания read для управления задержкой между выборками (нажмите 'q', чтобы выйти):

#!/bin/bash

dev="/proc/net/dev"
ifaces=($(awk '/[a-z0-9]+:/{print $1}' "$dev"))
bytes=($(awk '/[a-z0-9]+:/{print $2}' "$dev"))
nfaces=${#ifaces[@]}
c=0

tput civis
printf "Device   Bytes/sec\n--------------------\n"

while [ "$c" != 'q' ]; do
    read -n 1 -t 1 -r c
    if [ $? -ge 128 ]; then
        current=($(awk '/[a-z0-9]+:/{print $2}' "$dev"))
        for ((i = 0; i < nfaces; i++)); do
            rate=$((${current[i]}-${bytes[i]}))
            printf "%-8s %s\033[K\n" "${ifaces[i]}" "$rate"
        done
        printf "\033[${nfaces}A"
        bytes=(${current[@]})
    fi
done

printf "\033[1D%c\r\033[${nfaces}B" "${ifaces[0]:0:1}"
tput cnorm

exit 0

Пример использования / вывода

$ bash readnet.sh
Device   Bytes/sec
--------------------
eth0:    0
lo:      0
wlan0:   624

Просто еще один способ снять кожу с пресловутого кота.

0
David C. Rankin 22 Июл 2020 в 23:50