Como obter uma substring do comando bash

8

Dada a seguinte substring fornecida do comando df /dev/sdb1 | tail -n 1:

/dev/sdb1 1952971772 1441131032 511840740 74% /media/kaiman/ShareData

Eu gostaria de extrair 1952971772e 74%dessa string, usá-la em um script bash.

Eu sei que poderia usar alguns comandos de corte ou algo assim, mas não funcionará mais se um tamanho mudar, por exemplo.

Também pensei em usar um regex ou algo assim, mas gostaria de ter a abordagem mais recomendada.

Desde já, obrigado!

Nicolas DUVOISIN
fonte
2
Você está perguntando sobre o caso geral ou dfem particular? Neste último caso, você pode especificar determinados campos de saída explicitamente por exemplodf --output=pcent /dev/sdb1
steeldriver
2
Você está usando cuta posição do caractere na linha, o que faz com que ela falhe quando o comprimento da linha muda com as flutuações no tamanho do arquivo. Eu acredito que você pode dizer cutpara selecionar coluna 2e coluna 5delineadas por espaços, mas estou no telefone e não posso pesquisar e postar uma resposta efetivamente.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix O número de espaços pode variar, por isso é difícil dizer qual número de coluna está correto. cutverá uma coluna após cada delimitador.
precisa saber é o seguinte
Dois ou mais espaços contíguos ainda contam como um único espaço para delinear colunas, eu acho
WinEunuuchs2Unix 30/04/19
@ WinEunuuchs2Unix correto :) Eu os comandos de um arquivo de texto que tenho em mãos: D
Rinzwind 30/04/19

Respostas:

6
$ df /dev/sdb1 | awk '{ print $5 }' | tail -n 1

para a porcentagem e

$ df /dev/sdb1 | awk '{ print $2 }' | tail -n 1

para o tamanho.

Sem o tail:

df /home | awk 'NR==2 { print $2 }'
df /home | awk 'NR==2 { print $5 }'

  • awk '{ print $2 }'
    obtém a 2ª coluna onde vários separadores contam como 1. Portanto, a 2ª coluna é sempre a mesma para o seu sistema na 1ª parte do comando.

  • NR fornece o número total de registros que estão sendo processados ​​ou o número da linha.

Rinzwind
fonte
1
Ou se você precisar de ambos em uma linha df /home | awk '{print $2; print $5;}'.
Videonauth
3
Awk mantém a última linha no ENDbloco de modo em vez de usar tailuso apenasawk 'END { print $2,$5}'
Kevin
Para sua informação, nomeiei
WinEunuuchs2Unix
8

Resposta editada

Como @kevin afirmou, você pode usar awkpara selecionar apenas a última linha e evitar o uso da cauda, ​​usando ENDe também se quiser imprimir duas colunas ao mesmo tempo, você pode fazer isso:

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%

Resposta original

Você pode selecionar apenas a 2ª coluna:

$ df /dev/sdb1 | tail -1 | awk '{print $2}' 
1952971772

Onde $2indica a posição das colunas separadas por TAB. Você pode usar cutporque ele lida com apenas uma ocorrência de TAB e aqui existem múltiplos TABs para delimitar uma coluna.

noraj
fonte
3
Awk mantém a última linha no ENDbloco de modo em vez de usar tailuso apenasawk 'END { print $2,$5}'
Kevin