Como analiso o tipo de dados do relatório no Bash?

1

Qual é a melhor maneira de ler os seguintes dados no Bash? Por exemplo, se os dados são como ls -l , então eu poderia ler linha por linha e tenho todos os detalhes de um arquivo dentro de uma linha. Neste caso, eu tenho dados no seguinte formato, onde cada registro é separado por linha vazia. Estou apenas procurando uma ideia básica para poder criar minhas consultas para esses dados.

      Source:                 test
      Destination:            test2
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    16:45:45
      Mirror Timestamp:       Wed Nov  5 21:00:27 PST 2014
      Base Snapshot:          1573980876tsfr10_vol.550
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     944856 KB
      Last Transfer Duration: 00:01:42
      Last Transfer From:     -

      Source:                 test12
      Destination:            test123
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    10:41:00
      Mirror Timestamp:       Thu Nov  6 03:05:12 PST 2014
      Base Snapshot:          1573980876prd11_vol.1678
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     83982000 KB
      Last Transfer Duration: 03:21:38
      Last Transfer From:     -

      Source:                 abcd
      Destination:            xyz
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    02:40:52
      Mirror Timestamp:       Thu Nov  6 11:05:20 PST 2014
      Base Snapshot:          (1573980876prd12_vol.912
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     17520680 KB
      Last Transfer Duration: 01:23:56

Basicamente, uma opção que eu acho é que ter um loop de 15, já que existem 15 valores para cada registro e ler cada linha e, em seguida, procurar os dados que estou consultando, por exemplo, se estou tentando para encontrar "tamanho de transferência" do teste de origem.

    
por Raza 06.11.2014 / 23:11

3 respostas

1

Usando gawk 1 (com o sugerido por glenn jackman separador de registros ):

awk 'BEGIN { RS="" } /\<test\>/ { print $40,$41,$42 }' file
Size: 944856 KB

1. Observação: os operadores regex < e > são Gnu awk specific .

    
por 07.11.2014 / 03:36
3

Provavelmente, esse perl será útil: ele lê cada parágrafo em um hash, então você pode se referir aos campos diretamente pelo nome:

perl -00 -F':\s+|\n' -anE '
    %data = @F; 
    say "last transfer of test = ", $data{"Last Transfer Size"}
        if $data{Source} eq "test";
' file
last transfer of test = 944856 KB

A opção -00 divide a entrada em registros por seqüências de linhas em branco.
A opção -F define o separador de campo para ser uma nova linha ou dois pontos seguidos de espaços em branco.
A opção -n faz o script iterar sobre todos os registros no arquivo.
A opção -a divide o registro em campos e os armazena no array @F.

Presumo que o espaço em branco que você mostra na pergunta não esteja em seu arquivo.

    
por 07.11.2014 / 03:02
1

Se for para verificações manuais, você pode usar grep duas vezes:

  • Uma vez para usar o nome da fonte correta (o objeto). grep "<source/destination name>" -A 15 imprimirá o objeto e todos os seus sub-campos (15 linhas).
  • Segunda vez para encontrar o subcampo (propriedade do objeto). grep "<property name>" .

Juntos, será, por exemplo:

$ cat testfile.txt | grep "abcd" -A 15 | grep "Transfer Size"
Last Transfer Size:      17520680 KB

Isso seria bom para verificações manuais, mas para as automáticas, precisaríamos de mais informações. O DB também seria melhor para esse tipo de consulta.

    
por 07.11.2014 / 03:26