É possível imprimir apenas várias strings pesquisadas por sed?

0

Estou tentando extrair várias linhas de registro por regex.

mas o arquivo de log é grande, então estou ficando difícil. (cerca de 10GB) ..

Eu tentei várias maneiras, mas não consegui o resultado desejado.

por favor me dê o seu conselho.

1ª tentativa)

1) use regex em 'sublime app'. = > problema: mostra falta de memória.

2) use regex em 'ultra edit app'. = > problema: mostra falta de memória.

2ª tentativa) use o programa 'sed' no terminal no osx.

operação usada)

$sed -E -n '/.*output:[\S\s]*?AAA[\S\s]*?END.*/p' ./AppLog.txt

AAA está pesquisando chave. (USER_ID)

diz 'ER erro: operando operador de repetição inválido'.

Aqui está o conteúdo do AppLog.txt.

:
:
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID                   = {"AAA"}  <= searching key
01 USER_NAME                 = {"N"}
02 USER_TEL                  = {"001-1234-1234"}
: 
05 USER_LOCATION             = {"earth"}
[END]
=============================================
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID                   = {"BBB"}  <= searching key
01 USER_NAME                 = {"N"}
:
03 USER_LOCATION             = {"saturn"}
[END]
=============================================
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID                   = {"AAA"}  <= searching key
01 USER_NAME                 = {"N"}
02 USER_ADDR                 = {"bla~ bla~~"}
:
010 JOB                       = {"designer"}
[END]
=============================================
:
:

o resultado desejado é:

DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID                   = {"AAA"}  <= searching key
01 USER_NAME                 = {"N"}
02 USER_TEL                  = {"001-1234-1234"}
: 
05 USER_LOCATION             = {"earth"}
[END]
=============================================
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID                   = {"AAA"}  <= searching key
01 USER_NAME                 = {"N"}
02 USER_ADDR                 = {"bla~ bla~~"}
:
010 JOB                       = {"designer"}
[END]
=============================================
    
por user74176 06.04.2018 / 04:29

5 respostas

2

pcregrep funciona:

pcregrep -M \
   'DEBUG.*output:\n===*\n.*?\n.*?USER_ID.*?"AAA".*?(\n*?.*?\n*)*?===*' AppLog.txt 
    
por 06.04.2018 / 06:23
1

AWK -

awk -v RS='[\=]+[\=]' -v FS='\n' '/{"AAA"}/{ printf "%s%s%s%s",prevline,RT, $0, RT }{prevline="\n"$(NF-1)"\n"$NF}' ./AppLog.txt
  1. Registros separados por ======

  2. Últimas duas linhas armazenadas no prevline

  3. Imprimiu o valor armazenado anterior, o separador, o valor atual e o separador novamente.

por 06.04.2018 / 12:01
1

Uma ferramenta provavelmente mais rápida é o awk. Usando a linha [END] como eparador R ecord S :

awk -vRS='\[END\]' -vORS='[END]\n' '/\"AAA\"/' infile | 
awk '/output:$/,/\[END\]/'

A primeira linha seleciona os ecrãs R que contêm "AAA" .
A segunda linha limita a saída para linhas entre output: e [END] .

    
por 07.04.2018 / 00:54
0

Tente isto:

grep -A 3 -B 3 'AAA' ./AppLog.txt | sed '/--/d'

Saída:

DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID                   = {"AAA"}  <= searching key
01 USER_NAME                 = {"N"}
[END]
=============================================
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID                   = {"AAA"}  <= searching key
01 USER_NAME                 = {"N"}
[END]
=============================================

-A 3 - imprime outras 3 linhas depois do padrão correspondente

-B 3 - imprima outras 3 linhas antes do padrão correspondente

    
por 06.04.2018 / 04:58
0

Para o snippet:

FILE=${1-data1}

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Results:"
cgrep -d "/////" -w "DEBUG" +w "END" "AAA" $FILE

isso é produzido:

 Results:
/////
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID                   = {"AAA"}  <= searching key
01 USER_NAME                 = {"N"}
02 USER_TEL                  = {"001-1234-1234"}
: 
05 USER_LOCATION             = {"earth"}
[END]
/////
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID                   = {"AAA"}  <= searching key
01 USER_NAME                 = {"N"}
02 USER_ADDR                 = {"bla~ bla~~"}
:
010 JOB                       = {"designer"}
[END]

O código cgrep permite que uma janela seja especificada em torno do texto ( AAA ) que está sendo pesquisado. Então, neste caso, voltamos para DEBUG e encaminhamos para END .

Usamos o código ATT cgrep por anos. Ele precisa ser compilado, mas nunca encontramos erros com esse processo.

Aqui estão alguns detalhes sobre cgrep :

cgrep   shows context of matching patterns found in files (man)
Path    : ~/executable/cgrep
Version : 8.15
Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS ...)
Home    : http://sourceforge.net/projects/cgrep/ (doc)

Felicidades ... felicidades, drl

    
por 06.04.2018 / 13:58

Tags