netspeed 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/bin/sh
  2. usage () {
  3. cat <<EOF>&2
  4. Usage: ${0##*/} [INTERFACE]
  5. Return up and down transmission speed on given interface. If not given, use the
  6. first online interface returned by ifconfig (lo is ignored).
  7. EOF
  8. }
  9. [ $# -gt 1 ] && usage && exit 1
  10. [ "$1" = "-h" ] && usage && exit
  11. if [ -n "$1" ]; then
  12. interface="$1"
  13. else
  14. interface="$(ifconfig | grep -vm1 '^lo\|^ \|^$' | cut -f1 -d':')"
  15. ## AWK alternative
  16. # ifconfig | awk -F: '!/^ / && !/^$/ && $1!="lo" {print $1;exit}'
  17. fi
  18. if [ ! -d "/sys/class/net/${interface}" ]; then
  19. echo >&2 "Error: no such interface: ${interface}"
  20. else
  21. path="/dev/shm/netspeed"
  22. time=$(date +%s)
  23. read -r rx < /sys/class/net/"$interface"/statistics/rx_bytes
  24. read -r tx < /sys/class/net/"$interface"/statistics/tx_bytes
  25. if [ ! -f "$path" ]; then
  26. echo "$time $rx $tx" > "$path"
  27. chmod 0666 "$path"
  28. fi
  29. read -r time_old rx_old tx_old < "$path"
  30. echo "$time $rx $tx" > "$path"
  31. time_diff=$((time - time_old))
  32. if [ "$time_diff" -gt 0 ]; then
  33. rx_rate=$(((rx - rx_old) / time_diff))
  34. tx_rate=$(((tx - tx_old) / time_diff))
  35. [ "$rx_rate" -gt 1024 ] && rx_rate=$((rx_rate / 1024)) && rx_unit=K
  36. [ "$rx_rate" -gt 1024 ] && rx_rate=$((rx_rate / 1024)) && rx_unit=M
  37. [ "$tx_rate" -gt 1024 ] && tx_rate=$((tx_rate / 1024)) && tx_unit=K
  38. [ "$tx_rate" -gt 1024 ] && tx_rate=$((tx_rate / 1024)) && tx_unit=M
  39. printf "%s %s↓ %s %s↑" "$rx_rate" "$rx_unit" "$tx_rate" "$tx_unit"
  40. fi
  41. fi