Linux Grep 命令 - 在字符串之间提取多个文本

Linux Grep Command - Extract multiple texts between strings

上下文;

在 运行 我的服务器上执行以下命令后:

zgrep "ResCode-5005" /loggers1/PCRF*/_01_03_2022 > analisis.txt

我得到一个包含数千行的文本文件,如下例所示:

loggers1/PCRF1_17868/PCRF12_01_03_2022_00_15_39.log:[C]|01-03-2022:00:18:20:183401|140404464875264|TRACKING: CCR processing Compleated for SubId-5281181XXXXX, REQNO-1, REQTYPE-3, SId-mscp01.herpgwXX.epc.mncXXX.mccXXX.XXXXX.org;25b8510c;621dbaab;3341100102036XX-27cf0XXX, RATTYPE-1004, ResCode-5005 |processCCR|ProcessingUnit.cpp|423

(X代表递增的数字)

问题:

输出中充满了不必要的数据。我唯一需要的字符串部分是每行分隔的 MSISDN、IMSI 逗号,如下所示:

5281181XXXXX,3341100102036XX

我试过的步骤

zgrep "ResCode-5005" /loggers1/PCRF*/_01_03_2022| grep -o -P '(?<=SubId-).*?(?=, REQ)' > analisis1.txt

这给了我解决方案的第一部分

5281181XXXXX

然而,当我试图获取位于“334110”和“-”之间的第二个字符串时

zgrep "ResCode-5005" /loggers1/PCRF*/_01_03_2022| grep -o -P '(?<=SubId-).?(?=, REQ)' | grep -o -P '(?<=334110).?(?=-)' > analisis1.txt

没用。

如有任何意见,我们将不胜感激。

要获得 5281181XXXXXthe second string located between '334110' and "-",您可以使用如下模式:

\b(?:SubId-|334110)\K[^,\s-]+

模式匹配:

  • \b 防止部分单词匹配的单词边界
  • (?:非捕获组整体匹配
    • SubId-字面匹配
    • |
    • 334110字面匹配
  • )关闭非捕获组
  • \K忘记目前匹配的是什么
  • [^,\s-]+ 匹配除空白字符 ,-
  • 之外的任何字符出现 1 次以上

查看此 regex demo 中的匹配项。

将匹配:

5281181XXXXX
0102036XX

命令可能看起来像

zgrep "ResCode-5005" /loggers1/PCRF*/_01_03_2022 | grep -oP '\b(?:SubId-|334110)\K[^,\s-]+' > analisis1.txt