Como imprimir uma variável bash que tenha uma matriz como valor

2

Eu escrevi um script para o meu dwm statusbar. Uma parte é encontrar o uso da CPU atual para cada núcleo único no meu sistema. Eu mesmo descobri uma maneira, mas eu precisaria de ajuda para consertar um bug nisso. Aqui está o comando: top -bn 2 -d 0.5 | grep -F '%Cpu' | tail -n 4 | awk '{print $3}' . Isso pressupõe que seu top mostre cada núcleo por padrão. Você pode conseguir isso emitindo top , em seguida, pressionando 1 e, em seguida, pressionando W para salvar a configuração atual em um arquivo .toprc em sua pasta pessoal. Toda vez que você abrir top , ele exibirá todos os seus núcleos. Meu comando acima mencionado tem a desvantagem de quando atribuído a uma variável como esta:

CPU=$(top -bn 2 -d 0.5 | grep -F '%Cpu' | tail -n 4 | awk '{print $3}')

e, em seguida, usando $CPU com xsetroot assim: xsetroot -name "$CPU" Receberei a saída desejada na minha barra de status, mas entre cada porcentagem da CPU haverá dois símbolos uma em cima da outra separando-os v e %código%. Como me livrar deles? Tem algo a ver que eu posso estar usando uma matriz em vez de uma string aqui?

Você pode ver o problema no lado esquerdo da imagem .

Comando:

top -bn 2 -d 0.5 | grep -F '%Cpu' | tail -n 4 | awk '{print $3}'

exemplo de saída:

14.3
12.0
8.0
10.0

Nota para qualquer um que use este script: Quando o uso da CPU para um núcleo atingir t , a matriz que o comando gera moverá a coluna com a carga atual da coluna 100% para a coluna 3 . Assim, com 2 , você verá awk '{print $3}' como saída para a coluna us, . Se você está bem com isso, deixe isso. Se não, você pode ter 3 print column awk também. Será apenas 2 . Uma solução que evita todas essas armadilhas é:

top -bn 2 | grep -F '%Cpu' | tail -n 4 | gawk '{print $2 $3}' | tr -s '\n\:\,[:alpha:]' ' '
    
por lord.garbage 31.08.2014 / 15:06

1 resposta

3

O "material" entre os valores parece uma representação visual do caractere de nova linha para mim (código de caractere octal 12), que você obteria ao usar:

echo -e 'a2b'

O que você pode tentar é enviar a saída por tr '\n' ' ' com:

echo -e 'a2b' | tr '\n' ' '
    
por 31.08.2014 / 16:24