Как заметил @muru, проблема в том, что top использует escape-последовательности ANSI для форматирования своего вывода. Вы можете увидеть это, проложив через программу, например od, которая позволит вам видеть непечатаемые символы. Например, эта команда печатает поля «wa» и «hi» третьей строки top:
$ top -d 1 -n 1 | grep ^% | cut -d"," -f5,6
Выходной сигнал в моей системе:
1,0 wa , 0.0 hiДавайте посмотрим на непечатаемые символы:
$ 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
Как вы можете видеть выше, третий символ - B, и это то, re получение. Итак, предполагая, что вы хотите, чтобы скрипт: i) печатает все выходные данные top, ii) печатает поля «wa» и «hi» третьей строки и iii) печатает цифры из поля «wa», вы может сделать что-то вроде:
#!/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"