我正在尝试通过正则表达式提取多行日志。
但日志文件很大,所以我很难。 (约10GB)..
我尝试了多种方法但无法得到想要的结果。
第一次尝试)
1)在“sublime app”中使用正则表达式。 => 问题:显示内存不足。
2)在“超级编辑应用程序”中使用正则表达式。 => 问题:显示内存不足。
第二次尝试)在 osx 上的终端中使用“sed”程序。
使用的操作)
$sed -E -n '/.*output:[\S\s]*?AAA[\S\s]*?END.*/p' ./AppLog.txt
AAA 正在搜索关键字。 (用户身份)
它显示“RE 错误:重复运算符操作数无效”。
这是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]
=============================================
:
:
想要的结果是:
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]
=============================================
答案1
pcregrep
作品:
pcregrep -M \
'DEBUG.*output:\n===*\n.*?\n.*?USER_ID.*?"AAA".*?(\n*?.*?\n*)*?===*' AppLog.txt
答案2
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
记录由 ====== 分隔
最后两行存储在 prevline 中
再次打印先前存储的值、分隔符、当前值和分隔符。
答案3
awk 可能是一个更快的工具。使用该[END]
行作为右埃科德S分离器:
awk -vRS='\\[END\\]' -vORS='[END]\n' '/\"AAA\"/' infile |
awk '/output:$/,/\[END\]/'
第一行选择右包含 的记录"AAA"
。
第二行将输出限制为output:
和之间的行[END]
。
答案4
对于片段:
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
这是产生的:
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]
代码正则表达式允许在文本周围指定一个窗口(AAA)正在寻找。所以在这种情况下我们回到调试,并转发至结尾。
我们已经使用了 ATT 代码正则表达式多年。它需要编译,但我们从未在该过程中遇到任何错误。
以下是一些详细信息正则表达式:
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)
最美好的祝愿...干杯,drl