я просто хочу получить третий символ от watingForHDD. Какая-либо идея, как сделать это?
(моя идея состояла в том, чтобы регистрировать некоторые данные об используемой системной мощности и т.д....),
#!/bin/bash
x="`top -d 1 -n 1`"
echo "$x"
waitingForHDD=`echo "$x" | head -n3 | tail -n1 | cut -d"," -f9,10`
echo "$waitingForHDD" #output(with 2 spaces in the beginning): 0,6 wa
b=`echo "$waitingForHDD" | cut -c3`
echo "$b" #output(i mean WTF? thats not even in waitingForHDD): B
Вывод top
форматирование использования: В 0,6 wa
, эти 0,6
полужирным. Используйте пакетный режим (-b
) для отключения его:
$ top -bd 1 -n 1 | head -n3 | tail -n1 | cut -d, -f5 | cut -c3
1
(я нахожусь на различной локали, таким образом, поля в первом cut
отличаются.)
Попытка top -d 1 -n 1 | head -n3 | tail -n1 | cut -d, -f5 | less
для наблюдения специальных символов в действии.
Однако Вы могли бы быть лучше из использования чего-то как awk
вместо этого беспорядка head
с, tail
с и cut
с.
Как @muru указанный, проблема состоит в том что top
использование escape-последовательности ANSI для форматирования его вывода. Вы видите это путем передачи по каналу через программу как od
, который позволит Вам видеть непечатаемые символы. Например, эта команда печатает "wa" и "привет" поля 3-й строки top
:
$ top -d 1 -n 1 | grep ^% | cut -d"," -f5,6
вывод в моей системе:
1.0 wa, 0.0 привет
Позволяют нам взглянуть на непечатаемые символы:
$ 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
, и это - то, что Вы получаете. Так, принятие Вас хочет сценарий, который i) печатает все из top
вывод, ii) печатает "wa" и "привет" поля 3-й строки и 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"