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 .
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.
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 .
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.
Se for para verificações manuais, você pode usar grep
duas vezes:
grep "<source/destination name>" -A 15
imprimirá o objeto e todos os seus sub-campos (15 linhas). 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.
Tags bash text-processing