Como @muru apontou, o problema é que top
usa seqüências de escape ANSI para formatar sua saída. Você pode ver isso passando por um programa como od
, que permite ver caracteres não imprimíveis. Por exemplo, este comando imprime os campos "wa" e "hi" da 3ª linha de top
:
$ top -d 1 -n 1 | grep ^% | cut -d"," -f5,6
A saída no meu sistema é:
% bl0ck_qu0te%
Vamos dar uma olhada nos caracteres não imprimíveis:
$ top -d 1 -n 1 | grep ^% | cut -d"," -f5,6 | od -c
0000000 033 ( B 033 [ m 033 [ 3 9 ; 4 9 m 033 [
0000020 1 m 1 . 0 033 ( B 033 [ m 033 [
0000040 3 9 ; 4 9 m w a , 033 ( B 033 [ m 033
0000060 [ 3 9 ; 4 9 m 033 [ 1 m 0 . 0
0000100 033 ( B 033 [ m 033 [ 3 9 ; 4 9 m h
0000120 i \n
0000122
Como você pode ver acima, o terceiro caractere é um B
e é isso que você está recebendo. Então, supondo que você queira um script que i) imprima toda a saída de top
, ii) imprima os campos "wa" e "hi" da terceira linha e iii) imprima os dígitos do campo "wa", você poderia fazer algo como:
#!/usr/bin/env bash
x="$(top -d 1 -n 1)"
echo "$x"
waitingForHDD=$(grep ^% <<<"$x" | cut -d"," -f5,6)
echo "$waitingForHDD"
b=$(grep -oP '^.*?\K[.\d]+(?= )' <<<"$waitingForHDD" )
echo "$b"