Comando com múltiplas variáveis

1

Eu estou tentando fazer o comando para retornar o uso do disco nas pastas que ocupam 1+ GiBs, mas de alguma forma a segunda variável no comando apenas imprime o valor da primeira variável. Além disso, os valores dos totais são impressos não na coluna, mas como um texto genérico, usando espaços como um separador. O que estou fazendo errado aqui?

OUTPUT="$(sudo ls -lah -R |awk '/^total/ {print $2}' |sort -h)"; GIGS="$(echo $OUTPUT | grep G | sed 's/G//')"; echo $GIGS
    
por Andrew 26.02.2017 / 21:52

1 resposta

2

As novas linhas dentro de sua variável de substituição de comando OUTPUT são preservadas até serem divididas em palavras quando você echo delas para a substituição do comando GIGS - que é quando sua saída se transforma em uma única linha separada por espaço. Cite a variável para preservar as novas linhas. A variável GIGS é quase uma cópia da sua variável OUTPUT - você deve notar que o primeiro "G" nela foi deletado. Você pode estar tentando deletar todos os G's, neste caso você vai querer usar sed 's/G//g' .

Resultado final:

OUTPUT="$(sudo ls -lah -R |awk '/^total/ {print $2}' |sort -h)"; GIGS="$(echo "$OUTPUT" | grep G | sed 's/G//g')"; echo $GIGS

ou quebrado em várias linhas:

OUTPUT="$(sudo ls -lah -R |awk '/^total/ {print $2}' |sort -h)";
GIGS="$(echo "$OUTPUT" | grep G | sed 's/G//g')"; 
echo $GIGS

Como uma possível simplificação, considere fazer mais trabalho no awk:

sudo ls -alhR | awk '/^total/ && /G$/ { print substr($2, 1, length($2)-1) }' | sort -n

Isso estende seu padrão de correspondência awk para exigir que a linha termine em um 'G' (cuidando de seu grep), depois retira o caractere à direita (G) da string antes de imprimi-lo; então é um simples sort -n no final.

    
por 26.02.2017 / 22:05