是否可以仅打印 sed 搜索到的多个字符串?

是否可以仅打印 sed 搜索到的多个字符串?

我正在尝试通过正则表达式提取多行日志。

但日志文件很大,所以我很难。 (约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
  1. 记录由 ====== 分隔

  2. 最后两行存储在 prevline 中

  3. 再次打印先前存储的值、分隔符、当前值和分隔符。

答案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

相关内容