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
没用。
如有任何意见,我们将不胜感激。
要获得 5281181XXXXX
或 the 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
上下文;
在 运行 我的服务器上执行以下命令后:
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
没用。
如有任何意见,我们将不胜感激。
要获得 5281181XXXXX
或 the 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