Como grep entre palavras em um log?

1

Eu tenho um arquivo txt com linhas como abaixo.

Começando com:

 Parameters: {"raw_message"=>"MSH.......

Terminando com:

</HL7Message>"}

Eu estou querendo grep e saída para um arquivo as palavras entre cru e transformado que aparece no meio de cada linha.

O arquivo aparece como abaixo

Parameters: {"raw_message"=>"MSH....... "transformed_data".....</HL7Message>"}

Parameters: {"raw_message"=>"MSH....... "transformed_data".....</HL7Message>"}

Parameters: {"raw_message"=>"MSH....... "transformed_data".....</HL7Message>"}

Parameters: {"raw_message"=>"MSH....... "transformed_data".....</HL7Message>"}

Melhor cenário possível

O MSH após o > MSH inicia a saída, mas há muitas instâncias MSH em cada linha. Então eu imaginei que seria lógico passar a mensagem entre e depois rasgar a parte bruta e transformada.

raw_message"=>"MSH......preceding words followed by transformed

Algumas possíveis palavras precedentes transformadas     LAB \ r "," transformou     00355 "," transformado

Então eu quero

MSH....LAB\r
MSH....00355

Qualquer ajuda seria muito apreciada!

Eu tentei:

sed -n "/<raw>/,/<\/transformed>/p" HL7prod.txt > HL7prod2.txt

Linha de exemplo

 Parameters: {"raw_message"=>"MSH|^~\&||CDFGTL|||20144543000||ATG^A05|TLGTADM.1.13773085|P|2.1\rEVN|A08|11111111111|||MDFGQ8833^HLPS^GEGES^^^^\rPID|1||K11111111|K1111111|HOLVBVFS^LGDSA^^^^||19GHYSSD|F|^^^^^||^^^^^^^^|||||||K01045435547691\rPV1|1|P|K.ER^^||||LKIJK^Liujn^Jeggrs^H^^^MD|||ER||||||N||ER|||||||||||||||||||||DFLHL|ABD DFIN|PRE|||111111111||||||||\rZCS||^^^^||||00355", "transformed_data"=>"<HL7Message><MSH><MSH.1>|</MSH.1><MSH.2>^~\&amp;</MSH.2><MSH.3><MSH.3.1>CDFLH</MSH.3.1></MSH.3><MSH.4><MSH.4.1>COCTL</MSH.4.1></MSH.4><MSH.5/><MSH.6/><MSH.7><MSH.7.1>201506331000</MSH.7.1></MSH.7><MSH.8/><MSH.9><MSH.9.1>ADT</MSH.9.1><MSH.9.2>A08</MSH.9.2></MSH.9><MSH.10><MSH.10.1>TLGGBGM.1.13773076</MSH.10.1></MSH.10><MSH.11><MSH.11.1>P</MSH.11.1></MSH.11><MSH.12><MSH.12.1>2.1</MSH.12.1></MSH.12></MSH><EVN><EVN.1><EVN.1.1>A08</EVN.1.1></EVN.1><EVN.2><EVN.2.1>201506125500</EVN.2.1></EVN.2><EVN.3/><EVN.4/><EVN.5><EVN.5.1>MDHYQ6633</EVN.5.1><EVN.5.2>LUJKL</EVN.5.2><EVN.5.3>JYTEDFG</EVN.5.3><EVN.5.4/><EVN.5.5/><EVN.5.6/><EVN.5.7/></EVN.5></EVN><PID><PID.1><PID.1.1>1</PID.1.1></PID.1><PID.2/><PID.3><PID.3.1>K0567432372</PID.3.1></PID.3><PID.4><PID.4.1>K5894336</PID.4.1></PID.4><PID.5><PID.5.1>HOLDFGEER</PID.5.1><PID.5.2>AAAAS</PID.5.2><PID.5.3/><PID.5.4/><PID.5.5/><PID.5.6/></PID.5><PID.6/><PID.7><PID.7.1>1111111111</PID.7.1></PID.7><PID.8><PID.8.1>F</PID.8.1></PID.8><PID.9><PID.9.1/><PID.9.2/><PID.9.3/><PID.9.4/><PID.9.5/><PID.9.6/></PID.9><PID.10/><PID.11><PID.11.1/><PID.11.2/><PID.11.3/><PID.11.4/><PID.11.5/><PID.11.6/><PID.11.7/><PID.11.8/><PID.11.9/></PID.11><PID.12/><PID.13><PID.13.1/></PID.13><PID.14/><PID.15/><PID.16/><PID.17/><PID.18><PID.18.1>K0101333333333</PID.18.1></PID.18></PID><PV1><PV1.1><PV1.1.1>1</PV1.1.1></PV1.1><PV1.2><PV1.2.1>P</PV1.2.1></PV1.2><PV1.3><PV1.3.1>K.ER</PV1.3.1><PV1.3.2/><PV1.3.3/></PV1.3><PV1.4/><PV1.5/><PV1.6/><PV1.7><PV1.7.1>JTOLOKS</PV1.7.1><PV1.7.2>Ldasfs</PV1.7.2><PV1.7.3>Jtuygikd</PV1.7.3><PV1.7.4>H</PV1.7.4><PV1.7.5/><PV1.7.6/><PV1.7.7>MD</PV1.7.7></PV1.7><PV1.8/><PV1.9/><PV1.10><PV1.10.1>ER</PV1.10.1></PV1.10><PV1.11/><PV1.12/><PV1.13/><PV1.14/><PV1.15/><PV1.16><PV1.16.1>N</PV1.16.1></PV1.16><PV1.17/><PV1.18><PV1.18.1>ER</PV1.18.1></PV1.18><PV1.19/><PV1.20/><PV1.21/><PV1.22/><PV1.23/><PV1.24/><PV1.25/><PV1.26/><PV1.27/><PV1.28/><PV1.29/><PV1.30/><PV1.31/><PV1.32/><PV1.33/><PV1.34/><PV1.35/><PV1.36/><PV1.37/><PV1.38/><PV1.39><PV1.39.1>COTOLA</PV1.39.1></PV1.39><PV1.40><PV1.40.1>ABD XXXX</PV1.40.1></PV1.40><PV1.41><PV1.41.1>PRE</PV1.41.1></PV1.41><PV1.42/><PV1.43/><PV1.44><PV1.44.1>111111111</PV1.44.1></PV1.44><PV1.45/><PV1.46/><PV1.47/><PV1.48/><PV1.49/><PV1.50/><PV1.51/><PV1.52/></PV1><ZCS><ZCS.1/><ZCS.2><ZCS.2.1/><ZCS.2.2/><ZCS.2.3/><ZCS.2.4/><ZCS.2.5/></ZCS.2><ZCS.3/><ZCS.4/><ZCS.5/><ZCS.6><ZCS.6.1>111111</ZCS.6.1></ZCS.6></ZCS><GT1><GT1.6><GT1.6.1/></GT1.6></GT1><ZRF><ZRF.1><ZRF.1.1>COTYUL</ZRF.1.1></ZRF.1><ZRF.2><ZRF.2.1>CDFTL</ZRF.2.1><ZRF.2.2>K.ER</ZRF.2.2></ZRF.2></ZRF></HL7Message>"}

Queria:

MSH|^~\&||CDFGTL|||20144543000||ATG^A05|TLGTADM.1.13773085|P|2.1\rEVN|A08|11111111111|||MDFGQ8833^HLPS^GEGES^^^^\rPID|1||K11111111|K1111111|HOLVBVFS^LGDSA^^^^||19GHYSSD|F|^^^^^||^^^^^^^^|||||||K01045435547691\rPV1|1|P|K.ER^^||||LKIJK^Liujn^Jeggrs^H^^^MD|||ER||||||N||ER|||||||||||||||||||||DFLHL|ABD DFIN|PRE|||25679506645657||||||||\rZCS||^^^^||||00355
    
por Jeff 13.06.2015 / 15:40

3 respostas

1

Se você quiser apenas o texto entre seus padrões em cada linha, faça o seguinte:

sed 's/.*raw\(.*\)transformed.*//'

\(.*\) lembra o texto que é gerado usando . Outras coisas na linha não são produzidas.

    
por 13.06.2015 / 16:05
0

Se você tem um grep que suporta PCREs, você pode fazer

$ grep -oP 'Parameters: {"raw_message"=>"\K.+?(?=", "transformed_data")' file

Ou, se os seus arquivos são como você mostra, simplifique para:

$ grep -oP '=>"\K.+?(?=",)' file

Como alternativa, use awk , defina o separador de campo como => ou , e imprima o segundo campo (isso também corresponde ao " , canalizar até tr -d "'para removê-los):

$ awk -F'[,>]' '{print $2}' file

Ou, você poderia apenas grep para a primeira string citada começando com MSH:

$ grep -Po '"MSH.+?"' file

E, evitando as citações:

$ grep -Po '"\KMSH.*?(?=")' file
    
por 13.06.2015 / 23:00
0

As citações na sua Linha de exemplo parecem ser bastante significativas. Se não houver chance de uma citação de escape nessa sequência, tudo o que você precisa fazer é:

cut -d\" -f4 <in >out

Para obter o quarto campo em uma linha separada por " delimitadores de aspas duplas.

Se aspas duplas podem ocorrer com escape nessa cadeia de caracteres - como por barras invertidas -, então você poderia fazer:

sed 's/[^>]*."//;s/", ".*//' 

... para obter com segurança obter apenas o campo que você deseja, sem pular nada e sem falsos positivos. As duas substituições acima devem lidar com isso de forma bastante robusta se esses forem os únicos caracteres de citação (sem contar as barras invertidas) que podem ser usados e receberão todos os raw bits como > e que não há > ocorrendo em qualquer lugar antes dele.

    
por 14.06.2015 / 03:46

Tags