удар: использование “сокращения-c” на строках с пробелами как “?.?”

я просто хочу получить третий символ от 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
1
задан 26 October 2014 в 19:26

2 ответа

Вывод 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 с.

0
ответ дан 6 October 2019 в 22:13

Как @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"
0
ответ дан 6 October 2019 в 22:13

Другие вопросы по тегам:

Похожие вопросы: