Extrai o valor específico dos blocos de dados

2

Eu tenho os blocos de dados que são diferenciados pelos IDs globais, conforme abaixo. Eu preciso extrair o último bloco de dados com o maior valor de id, no exemplo abaixo, id="82" .

<gc type="global" id="80" totalid="80" intervalms="315080.595">
---Remaining data---------
 </gc>
 <gc type="global" id="81" totalid="81" intervalms="315080.595">
---Remaining data---------
 </gc>
 <gc type="global" id="82" totalid="82" intervalms="315080.595">
---Remaining data---------
 </gc>

Eu posso executar o abaixo. No entanto, ele irá restringir o valor de id para ser apenas dois dígitos. Você poderia, por favor, informar como eu posso derivar o último bloco de dados sem colocar a restrição de dígitos no valor id.

data1='grep "gc type="global"" abc.log| cut -c24-26|tail -n1'

lastdata="gc type="global"=$data1"

sed -n '/'"${lastdata}"'/,$p' abc.log>last_block_data.log
    
por alex 31.07.2015 / 15:06

3 respostas

1

Você não tem que cut by -c de contagem de caracteres. Em vez disso, você pode cut em um -d elimitador especificado.

grep '^<gc type="global"' <infile | cut -d\" -f4
80
81
82

Isso obtém apenas o campo 4 " -delimited em uma linha. E assim, esse campo pode ter tantos caracteres - ou dígitos, se você preferir - quanto quiser, desde que nenhum deles seja aspas duplas.

Mas você não precisa fazer isso também se quiser a linha completa.

sed -e'/^<gc type="global"/!{g;/./q;d;}' -e'h;$!d' <infile
    
por 31.07.2015 / 22:02
0
awk -F[=\"] '{
    a[FNR]=$0;
    if ($6>l && $0 ~ "<gc type=\"global\""){
        l=$6;f=1;s=FNR
    };
    if($0 ~ "</gc>" && f==1 ){
        e=FNR;f=0
    }}
    END{ 
    for (i=s;i<=e;i++) {
        print a[i]
}}'

Isso imprimirá o bloco começa em <gc type="global" até </gc> que tem o maior ID.

Todas as linhas são salvas no array a com chave como FNR

Primeiro if definirá o sinalizador f e definirá a variável de início de chave do array s to FNR se o sexto campo que for id maior que o anterior e a linha tiver string <gc type=\"global\" .

Próximo if redefine o sinalizador e define a variável final da chave do array e to FNR se a linha contiver string </gc> e f igual a 1

No END elementos na matriz a são impressos somente quando o valor da chave entre s e e .

    
por 31.07.2015 / 15:44
0

Você pode encontrar as linhas com 'type =' global '' e usar sed para extrair os valores dentro das aspas depois de 'id =': '

$ grep 'type="global"' /tmp/foo | sed -e 's/^.*id="\([0-9]*\)".*$//'
80
81
82
...
    
por 31.07.2015 / 17:59

Tags