Is there a method to get the current network speed (just like I can get with «nload») in a bash script? I would just put into a variable the speed at the moment where script is running. Ex: «./script.sh» would output «In: 50Ko/s | Out: 25Ko/s».

Thanks :)

  • netstat -i can be used as well, but same is necessary as CJSewell mentioned, you have to take samples with a time diff and calculate.
    – MaQleod
    Mar 5, 2015 at 17:04

2 Answers 2


cat /proc/net/dev shows how many bytes have been transferred on each interface.

You could take a few samples and calculate the current kilobytes per second?

Here is a script I found and modified a little traffic.sh. Copy it to some where in your PATH and change permisions to 755 chmod 755 traffic.sh

Usage is

traffic.sh eth0

Prints out

 Transmitted: 5352K
 Received: 13M
 Total: 19M
 Sleeping 3 to calculate speed...
 Current speed: 690B/s
  • Created a new version which outputs what you requested netspeed.sh
    – CJSewell
    Mar 4, 2015 at 19:32

Below is a script that works on most embedded Linux routers such as Ubiquiti and OpenWRT compatible ones and gets its details from /proc/net/dev.

(And easy to change to packets etc.)


SLP=1 # output / sleep interval
for GOOD_DEVICE in `grep \: /proc/net/dev | awk -F: '{print $1}'`; do
    if [ "$DEVICE" = $GOOD_DEVICE ]; then

if [ $IS_GOOD -eq 0 ]; then
    echo "Device not found. Should be one of these:"
        grep ":" /proc/net/dev | awk -F: '{print $1}' | sed s@\ @@g 
    exit 1

while true; do

LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED1=`echo $LINE | awk '{print $1}'`
TRANSMITTED1=`echo $LINE | awk '{print $9}'`

sleep $SLP

LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED2=`echo $LINE | awk '{print $1}'`
TRANSMITTED2=`echo $LINE | awk '{print $9}'`

printf "In: %12i KB/s | Out: %12i KB/s | Total: %12i KB/s\n" $(($INSPEED/1024)) $(($OUTSPEED/1024)) $((($INSPEED+$OUTSPEED)/1024)) ;


Copy the above to your clipboard and then in a terminal session on your router:

$ cat > /tmp/n.sh

then: Ctrl+V (or right click / Paste)

then: Ctrl+D

$ chmod +x /tmp/n.sh

$ /tmp/n.sh eth0

You can also paste it in a notepad, then just repeat the above if you need to edit it - not all embedded routers have an editor! Make sure you copy everything from the # at the top to the done; at the bottom.

You might have to change the /bin/bash to /bin/sh or vice versa. There is another example that uses /sys here: How to get real-time network statistics in Linux with KB/MB/Bytes format and for specific port or application processID?

Source: https://gist.github.com/dagelf/ab2bad26ce96fa8d79b0834cd8cab549

  • Please do not post the same answer to multiple questions. If the same information really answers both questions, then one question (usually the newer one) should be closed as a duplicate of the other. You can indicate this by voting to close it as a duplicate or, if you don't have enough reputation for that, raise a flag to indicate that it's a duplicate. Otherwise tailor your answer to this question and don't just paste the same answer in multiple places.
    – DavidPostill
    May 23, 2018 at 17:15
  • How is your comment relevant to the question at hand? Does SO not have a private message function? Does SO have a similar but not duplicate? If you took the time to read you would see that it is tailored. I posted it here because this comes up on another Google search and why post just a link when I can put the answer here? Rather fix SO.
    – Dagelf
    May 24, 2018 at 19:51
  • The private message function is reserved for situations that require a moderator message - normally this is only used for behavior which requires suspension - which this does not.
    – DavidPostill
    May 24, 2018 at 20:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.