Obtendo o egrep -o output em uma linha

0

Estamos tentando obter apenas os dados da saída abaixo, tentamos excluir os dados com o comando egrep , mas os dados que obtemos estão na linha diferente, como faço para obter os dados em uma linha. / p>

Total: 44.75TB   Used: 0.44TB    Available:42.04TB       Usage(5% System alocation included):6.07%

Aqui está o requisito

44.75   0.44    42.04       6.07

O que tentamos é o seguinte comando e a saída

# cat output| egrep -o "[+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9]"
44.75
0.44
42.04
6.07
    
por Shanker 16.06.2017 / 10:03

2 respostas

2

Parece que você deseja obter todos os valores depois de : e se juntar a eles usando o espaço ou a guia

perl é uma opção

$ perl -lne 'print join "\t",/:\h*\K[^ ]+/g' output
44.75TB 0.44TB  42.04TB 6.07%
  • /:\h*\K[^ ]+/g obterá caracteres não espaciais que estão presentes após um : e espaços horizontais opcionais
    • use \H em vez de [^ ] se a separação de campos puder ter caracteres de tabulação
  • join "\t", unirá as strings correspondidas com tab como separador


Para obter apenas números

$ perl -lne 'print join "\t",/:\h*\K[\d.]+/g' output
44.75   0.44    42.04   6.07
  • assume números com apenas dígitos e ponto decimal e não verifica a validade, ele corresponderá até 1.324.4 , ... etc, que vem depois de : e espaços opcionais
por 16.06.2017 / 10:12
1

Podemos tratar a linha de entrada como vários registros, cada registro sendo delimitado por dois ou mais espaços. Cada registro pode ser dividido em dois campos com base nos dois pontos e em qualquer espaço depois dele. Queremos o segundo campo em cada registro.

Com o GNU awk (ou mawk , mas não nawk , que não gosta de expressões regulares como separadores de registros):

$ awk -vRS="   *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in
44.75TB 0.44TB 42.04TB 6.07%
  • RS=" *|\n" define o separador de registro para dois ou mais espaços ou uma nova linha. Isso divide Total: 44.75TB Used: 0.44TB em dois registros, Total: 44.75TB e Used: 0.44TB .
  • FS=": ?" define o separador de campos como dois pontos, seguido opcionalmente por um espaço. Isso divide Used: 0.44TB em dois campos, Used e 0.44TB .
  • ORS=" " define o separador de registro output como um espaço.

O código awk simplesmente imprime o segundo campo de cada registro separado por ORS e finaliza com a saída de uma nova linha.

Se você quiser remover tudo o que não é um número, passe-a por tr -dc '0-9. \n' :

$ awk -vRS="   *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in | tr -dc '0-9. \n'
44.75 0.44 42.04 6.07

tr -dc '0-9. \n' excluirá qualquer coisa que não seja um dígito, ponto, espaço ou nova linha.

    
por 16.06.2017 / 10:25