Tu problema tiene que ver con la codicia de .*
. Todavía puedes hacerlo en sed
, pero es más fácil con Perl:
$ echo 'range 1.1.1.10 1.1.1.100;' | perl -ne 'printf("IP range is %d-%d\n", (/\.(\d+)[^.]/g))'
IP range is 10-100
El script de Perl compara los números al final de las direcciones IP y los devuelve como dos números enteros que se usan en printf()
para imprimir la cadena de salida formateada.
La expresión regular de Perl
/\.(\d+)[^.]/g
capturará cada conjunto de dígitos precedidos por un punto, pero no seguidos por un punto.
En sed
realmente no tienes que hacer la sustitución de una sola vez:
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);/\1/'
range 1.1.1.10 100
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);/\1/' -e 's/[^ ]*\.([0-9]+) /\1-/'
range 10-100
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);/\1/' -e 's/[^ ]*\.([0-9]+) /\1-/' -e 's/range/IP & is/'
IP range is 10-100
El guión final sed
:
s/[^ ]*\.([0-9]+);/\1/; # Isolate last number in range
s/[^ ]*\.([0-9]+) /\1-/; # Isolate first number in range, add dash
s/range/IP & is/; # Sort out text at start
Que, después de la inspección, se puede reducir a
s/[^ ]*\.([0-9]+)[^.]/-\1/g
s/range -/IP range is /
Eso es
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+)[^.]/-\1/g' -e 's/range -/IP range is /'
IP range is 10-100
Я могу предложить вам альтернативный способ. И это через пакет systat(ссылка для арки), и он предоставляет команды как mpstat
, iostat
и многие другие.
Вывод mpstat:
Linux 4.9.43-1-lts (laptop) 18/08/2017 _x86_64_ (4 CPU)
19:51:50 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
19:51:50 all 2,18 0,03 0,58 0,07 0,00 0,02 0,00 0,00 0,00 97,13
Вывод iostat:
Linux 4.9.43-1-lts (laptop) 18/08/2017 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2,18 0,03 0,60 0,07 0,00 97,13
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 3,13 28,15 80,47 1029654 2943525