Basta ligar a saída compatível com POSIX (-P) para df:
$ df -Pk /dev/sda1 | tail -n 1 | awk '{print $4}'
Isso garante que o formato de cada linha seja o mesmo (sem alimentação de linha após nomes longos de dispositivos).
Quando eu uso o df -h, recebo a seguinte saída:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 59G 2.2G 54G 4% /
/dev/sda1 122M 38M 78M 33% /boot
tmpfs 1.1G 0 1.1G 0% /dev/shm
10.10.0.105:/somepath
11T 8.4T 2.1T 81% /storage4
10.11.0.101:/somepath
15T 8.9T 5.9T 61% /storage1
/dev/mapper/patha 5.0T 255G 4.8T 5% /storage5_vol0
/dev/mapper/pathb 5.0T 195G 4.9T 4% /storage5_vol1
/dev/mapper/pathc 5.0T 608G 4.5T 12% /storage5_vol2
Eu quero escrever um script que obtenha o valor da coluna Avail em um armazenamento específico.
Eu costumava usar
df -k /storage_name | tail -1 | awk '{print $3}'
Mas a coluna FileSystem pode ter um valor ou não .. o que mudaria a variável do meu script de $ 3 para $ 4.
Como posso obter o Avail em uma única linha de comando, mesmo que não haja valores nas colunas anteriores?
Use a opção -P para df, para garantir que a saída seja normalizada e não dividida em várias linhas.
E, de qualquer forma - você também pode usar $ (NF-2) para imprimir a coluna disponível.
Trabalhe com a variável NF (número de campos). Algo como:
df -k / storage_name | tail -1 | awk 'NF == 6 {print $ 3}; NF == 5 {print $ 4}'
df -k /dev | tail -1 | sed s/"^[^0-9]*"// | awk '{print $3}'
A adição do sed removerá todos os caracteres não dígitos do início da linha. Você pode precisar modificá-lo um pouco se tiver dígitos no nome do seu sistema de arquivos
Tags shell