bash: usando “cut -c” nas strings com espaços como “?.?”

1

Eu só quero que o terceiro caractere do watingForHDD. Alguma ideia de como fazer isso?

(minha ideia era registrar alguns dados sobre a capacidade do sistema usado etc ...)

#!/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
    
por HomelessGamer 26.10.2014 / 17:26

2 respostas

0

A saída de top usa formatação: Em 0,6 wa , o 0,6 está em negrito. Use o modo em lote ( -b ) para desativá-lo:

$ top -bd 1 -n 1 | head -n3 | tail -n1 | cut -d, -f5 | cut -c3
1

(Eu estou em um local diferente, então os campos no primeiro cut diferem.)

Teste top -d 1 -n 1 | head -n3 | tail -n1 | cut -d, -f5 | less para ver os caracteres especiais em ação.

Dito isso, talvez seja melhor usar algo como awk em vez desse emaranhado de head s, tail s e cut s.

    
por muru 26.10.2014 / 17:35
0

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"
    
por terdon 26.10.2014 / 18:27