filtra linhas contendo uma palavra-chave e um ID se o ID aparecer em outra linha novamente

2

Esta questão é uma variação de Como faço para grep para múltiplos padrões em múltiplas linhas?

Este é o texto de exemplo onde as linhas contendo "reqId: regexpat" ou "reqCompleted: regexpat" devem ser combinadas em pares onde 'regexpat' é único, na verdade, pode ser um UUID.

2016-09-27 GET /some/uri - reqId: 000-pat1-bgr, more text 
2016-09-27 GET /some/uri - reqId: 0.215487, your favourite song
2016-09-27 irrelevant message
2016-09-27 ignored record
2016-09-27 reqCompleted: 999-xxx-vvv, ignore this
2016-09-27 reqCompleted: 0.215487, more characters
2016-09-27 reqCompleted: 000-pat1-bgr, more characters
2016-09-27 another lost message

O resultado esperado deve ser

2016-09-27 GET /some/uri - reqId: 000-pat1-bgr, more text 
2016-09-27 GET /some/uri - reqId: 0.215487, your favourite song
2016-09-27 reqCompleted: 0.215487, more characters
2016-09-27 reqCompleted: 000-pat1-bgr, more characters

000-pat1-bgr e 0.215487 são identificadores exclusivos. Eu tentei grep com suporte perl-regex

grep --null-data --only-matching --perl-regex '(?s)^\N+ RequestId:, \N+$\n(?:.*)^\N+ reqCompleted: ([a-z0-9\.-]+), .\N+$\n'

Mas isso é o que eu recebo

2016-09-27 GET /some/uri - reqId: 000-pat1-bgr, more text 
2016-09-27 GET /some/uri - reqId: 0.215487, your favourite song
2016-09-27 irrelevant message
2016-09-27 ignored record
2016-09-27 reqCompleted: 999-xxx-vvv, ignore this
2016-09-27 reqCompleted: 0.215487, more characters
2016-09-27 reqCompleted: 000-pat1-bgr, more characters

É possível conseguir isso com um comando greer de liner?

    
por Luis Muñoz 27.09.2016 / 19:09

2 respostas

3

outra maneira de manter a ordem de linha desde o uso do grep

awk -F"[:,]" '/reqCompleted/ || /reqId/{
  dupsIDs[$(NF-1)]++
}END{
   for (x in dupsIDs)
     if (dupsIDs[x]==2) print x
}' infile |grep -f - infile

2016-09-27 GET /some/uri - reqId: 000-pat1-bgr, more text
2016-09-27 GET /some/uri - reqId: 0.215487, your favourite song
2016-09-27 reqCompleted: 0.215487, more characters
2016-09-27 reqCompleted: 000-pat1-bgr, more characters
    
por αғsнιη 27.09.2016 / 19:19
0

Usando awk , encontrou a solução:

awk 'BEGIN{FS=":|,";i=0;}
/reqCompleted/ || /reqId/{
    arr[$i]=$2; 
    lines[$i]=$0; 
    i++;
}END{
    for(key in arr){
         if(arr[key] in arr){
         }else{
             print lines[key]
         };
    }
}' input.txt

Isso fornece a saída esperada como:

2016-09-27 reqCompleted: 000-pat1-bgr, more characters
2016-09-27 GET /some/uri - reqId: 0.215487, your favourite song
2016-09-27 reqCompleted: 0.215487, more characters
2016-09-27 GET /some/uri - reqId: 000-pat1-bgr, more text  
    
por snoop 27.09.2016 / 20:38