pcregrep
funciona:
pcregrep -M \
'DEBUG.*output:\n===*\n.*?\n.*?USER_ID.*?"AAA".*?(\n*?.*?\n*)*?===*' AppLog.txt
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]
=============================================
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
Registros separados por ======
Últimas duas linhas armazenadas no prevline
Imprimiu o valor armazenado anterior, o separador, o valor atual e o separador novamente.
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]
.
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
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