---
name: "ttyplot"
section: "1"
platform: "linux"
package: "ttyplot"
version: "1.7.0-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/ttyplot"
---

# ttyplot(1)

realtime terminal plotting utility

## NAME

**ttyplot** – realtime terminal plotting utility

## SYNOPSIS

**ttyplot** \[*options*\]

**ttyplot** -v

**ttyplot** -h

## DESCRIPTION

**ttyplot** takes data from standard input, most commonly some tool like [ping(1)](/ping/1.md), [snmpget(1)](/snmpget/1.md), [netstat(8)](/netstat/8.md), [ifconfig(8)](/ifconfig/8.md), [sar(1)](/sar/1.md), [vmstat(8)](/vmstat/8.md), etc., and plots in text mode on a terminal in real time.

Supports rate calculation for counters and up to two graphs on a single display using reverse video for second line.

The following options are supported:

- **-2**

  Read two values and draw two plots, the second in reverse video.

- **-r**

  Calculate counter rate and divide by measured sample interval.

- **-c** *plotchar*

  Use *plotchar* for the plot line, e.g. ‘@ # % .’ etc.

- **-e** *errcharmax*

  Use *errcharmax* for plot error line when value exceeds hardmax. Default: ‘e’.

- **-E** *errcharmin*

  Use *errcharmin* for plot error symbol, displayed when plot value is less than hardmin. Default: ‘v’.

- **-s** *softmax*

  Use *softmax* as the initial maximum value but allow it to grow with input.

- **-m** *hardmax*

  Use *hardmax* as a hard value limit after which an error line will be drawn( see **-e**). Should be greater than hardmin, if set.

- **-M** *hardmin*

  Use *hardmin* as a definite minimum limit of the plot range. If a plot value is less than this, error symbol will be drawn( see **-E**).

- **-t** *title*

  Use *title* as the plot title.

- **-u** *unit*

  Label the vertical axis *unit*.

- **-v**

  Print the current version and exit.

- **-h**

  Print this help message and exit.

## KEY BINDINGS

When reading data from a pipe, **ttyplot** accepts the following commands typed at the terminal:

- **q**

  Quit.

- **r**

  Toggle "rate mode" on and off.

## EXAMPLES

CPU usage from [vmstat(8)](/vmstat/8.md) using [awk(1)](/awk/1.md) to pick the right column:

```
vmstat -n 1 \
 | gawk '{ print 100-int($(NF-2)); fflush(); }' \
 | ttyplot
```

CPU usage from [sar(1)](/sar/1.md) with title and fixed scale to 100%:

```
sar 1 \
 | gawk '{ print 100-int($NF); fflush(); }' \
 | ttyplot -s 100 -t "cpu usage" -u "%"
```

Memory usage from [sar(1)](/sar/1.md), using [perl(1)](/perl/1.md), to pick the right column:

```
sar -r 1 \
 | perl -lane 'BEGIN{$|=1} print "@F[5]"' \
 | ttyplot -s 100 -t "memory used %" -u "%"
```

Number of processes in running and io blocked state:

```
vmstat -n 1 \
 | perl -lane 'BEGIN{$|=1} print "@F[0,1]"' \
 | ttyplot -2 -t "procs in R and D state"
```

Load average via [uptime(1)](/uptime/1.md) and [awk(1)](/awk/1.md):

```
{ while true; do
    uptime | gawk '{ gsub(/,/, ""); print $(NF-2) }'
    sleep 1
  done } | ttyplot -t "load average" -s load
```

Ping plot with [sed(1)](/sed/1.md):

```
ping 8.8.8.8 \
 | sed -u 's/^.*time=//g; s/ ms//g' \
 | ttyplot -t "ping to 8.8.8.8" -u ms
```

WiFi signal level in -dBM (higher is worse) using [iwconfig(8)](/iwconfig/8.md):

```
{ while true; do
    iwconfig 2>/dev/null \
     | grep "Signal level" \
     | sed -u 's/^.*Signal level=-//g; s/dBm//g'
    sleep 1
  done } | ttyplot -t "wifi signal" -u "-dBm" -s 90
```

CPU temperature from proc;

```
{ while true; do
    awk '{ printf("%.1f0, $1/1000) }' \
         /sys/class/thermal/thermal_zone0/temp
    sleep 1
  done } | ttyplot -t "cpu temp" -u C
```

Fan speed from [sensors(1)](/sensors/1.md) using [grep(1)](/grep/1.md), [tr(1)](/tr/1.md) and [cut(1)](/cut/1.md):

```
{ while true; do
    sensors | grep fan1: | tr -s " " | cut -d" " -f2
    sleep 1
  done } | ttyplot -t "fan speed" -u RPM
```

Bitcoin price chart using [curl(1)](/curl/1.md) and [jq(1)](/jq/1.md):

```
{ while true; do
    curl -sL https://api.coindesk.com/v1/bpi/currentprice.json \
     | jq .bpi.USD.rate_float
    sleep 600
  done } | ttyplot -t "bitcoin price" -u usd
```

Stock quote chart:

```
{ while true; do
    curl -sL https://api.iextrading.com/1.0/stock/googl/price
    echo
    sleep 600
  done } | ttyplot -t "google stock price" -u usd
```

Prometheus load average via **node\_exporter**:

```
{ while true; do
    curl -s  http://10.4.7.180:9100/metrics \
     | grep "^node_load1 " \
     | cut -d" " -f2; sleep 1
  done } | ttyplot
```

### Network/disk throughput examples

**ttyplot** supports two-line plots for in/out or read/write.

Local network throughput for all interfaces combined from [sar(1)](/sar/1.md):

```
sar -n DEV 1 | gawk '{
  if($6 ~ /rxkB/) {
     print iin/1000;
     print out/1000;
     iin=0;
     out=0;
     fflush();
  }
  iin=iin+$6;
  out=out+$7;
}' | ttyplot -2 -u "MB/s"
```

SNMP network throughput for an interface using ‘ttg’:

```
ttg -i 10 -u Mb 10.23.73.254 public 9 \
 | gawk '{ print $5,$8; fflush(); }' \
 | ttyplot -2 -u Mb/s
```

SNMP network throughput for an interface using [snmpdelta(1)](/snmpdelta/1.md):

```
snmpdelta -v 2c -c public -Cp 10 \
          10.23.73.254 1.3.6.1.2.1.2.2.1.{10,16}.9 \
 | gawk '{ print $NF/1000/1000/10; fflush(); }' \
 | ttyplot -2 -t "interface 9 throughput" -u Mb/s
```

Disk throughput from [iostat(1)](/iostat/1.md):

```
iostat -xmy 1 nvme0n1 \
 | stdbuf -o0 tr -s " " \
 | stdbuf -o0 cut -d " " -f 4,5 \
 | ttyplot -2 -t "nvme0n1 throughput" -u MB/s
```

### Rate calculator for counters

**ttyplot** also supports counter style metrics, calculating a rate by measuring time difference between samples.

SNMP network throughput for an interface using [snmpget(1)](/snmpget/1.md):

```
{ while true; do
    snmpget  -v 2c -c public \
             10.23.73.254 1.3.6.1.2.1.2.2.1.{10,16}.9 \
     | awk '{ print $NF/1000/1000; }'
    sleep 10
  done } | ttyplot -2 -r -u "MB/s"
```

Local interface throughput using [ip(8)](/ip/8.md) and [jq(1)](/jq/1.md):

```
{ while true; do
    ip -s -j link show enp0s31f6 \
     | jq '.[].stats64.rx.bytes/1024/1024, \
           .[].stats64.tx.bytes/1024/1024'
    sleep 1
  done } | ttyplot -r -2 -u "MB/s"
```

Prometheus node exporter disk throughput for */dev/sda*:

```
{ while true; do
    curl -s http://10.11.0.173:9100/metrics \
     | awk '/^node_disk_.+_bytes_total{device="sda"}/ {
         printf("%f0, $2/1024/1024);
       }'
    sleep 1
  done } | ttyplot -r -2 -u MB/s -t "10.11.0.173 sda writes"
```

## AUTHORS

**ttyplot** is written by:\
 Antoni Sawicki ⟨*tenox@google.com*⟩, Edgar Bonet ⟨*linux@edgar-bonet.org*⟩ and Sebastian Pipping ⟨*sebastian@pipping.org*⟩.

Its readme was converted into this manual page by Sijmen J. Mulder ⟨*ik@sjmulder.nl*⟩.

## BUGS

By default in standard in- and output are is buffered. This can be worked around in various *ways:* **http://www.perkin.org.uk/posts/how-to-fix-stdio-buffering.html**.

**ttyplot** quits and erases the screen when there is no more data. This is by design and can be worked around by adding [sleep(1)](/sleep/1.md) or [read(1)](/read/1.md), for example:

```
{ echo 1 2 3; sleep 1000; } | ttyplot
```

When running interactively and non-numeric data is entered (e.g. some key) **ttyplot** hangs. Press ‘Ctrl^J’ to reset.
