我在循环$p
中读取的文件中含有以下数据while
。我使用( )grep
行来表示、 和。当我发现标签存在时,我想提取标签后面括号中的值。$p
PID
APPLTAG
UOWLOGDA
UOWLOGTI
AMQ8276: Display Connection details.
CONN(4C521F5F01501624)
EXTCONN(414D5143534154322020202020202020)
TYPE(CONN)
PID(27948)
APPLTAG(WebSphere MQ Client for Java)
UOWLOGDA(2020-07-29) UOWLOGTI(11.50.30)
AMQ8276: Display Connection details.
CONN(4C521F5F9920182E)
EXTCONN(414D5143534154322020202020202020)
TYPE(CONN)
PID(23273) APPLTAG(service.core.EnricherMain)
UOWLOGDA(2020-07-29) UOWLOGTI(11.50.46)
答案1
好吧,你可以grep
只使用回顾来获得值:
$ grep -Po '(?<=PID\(|APPLTAG\(|UOWLOGDA\(|UOWLOGTI\()[^)]+' file
27948
WebSphere MQ Client for Java
2020-07-29
11.50.30
23273
service.core.EnricherMain
2020-07-29
11.50.46
-P
Perl 风格的正则表达式-o
仅打印匹配的模式(?<=things)stuff
things
获取后验断言后的内容\(
文字左括号thing1|thing2
交替 - 匹配thing1
或thing2
[^)]+
一些不是右括号的字符
此表达式适用于您的示例,但将其添加\b
到搜索模式的前面可能更可靠,这样只有在它们前面有单词分隔符(行首、空格、制表符等)时才会被捕获,以防同一模式可能是单词的结尾部分。此外,如果有可能匹配的单词后跟一个左括号,而没有右括号,而您不想捕获,您可以通过在(?=\))
此处附加来明确地向前查找右括号,以便更可靠地仅获取匹配括号之间的字符:
grep -Po '(?<=\bPID\(|\bAPPLTAG\(|\bUOWLOGDA\(|\bUOWLOGTI\()[^)]+(?=\))'
但我不确定这种方法是否适合您的目的。
非常感谢fra-san提出改进建议这个答案:)