I have the following data in a file I am reading into $p
in a while
loop. I grep
the line ($p
) for PID
, APPLTAG
, UOWLOGDA
and UOWLOGTI
. When I find the tag present, I want to extract the value in the paren following the tag.
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)
Well, you can grep
just the values with a lookbehind:
$ 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 style regex-o
print the matched pattern only(?<=things)stuff
get the stuff after things
(lookbehind assertion)\(
the literal opening parenthesisthing1|thing2
alternation - match thing1
or thing2
[^)] +
некоторые символы, которые не являются закрывающей скобкой Это выражение работает на вашем образце, но может быть более надежным добавить \ b
к паттерны поиска, чтобы они были перехвачены только в том случае, если перед ними стоят разрывы слов (начало строки, пробел, табуляция и т. д.), если тот же паттерн может быть конечной частью слова. Кроме того, если есть вероятность, что за соответствующим словом, за которым следует открывающая скобка, без закрывающей скобки, которую вы не хотите перехватывать, вы можете явно посмотреть вперед для закрывающей скобки, добавив (? = \))
здесь, чтобы более надежно получить только символы между совпадающими скобками:
grep -Po '(?<=\bPID\(|\bAPPLTAG\(|\bUOWLOGDA\(|\bUOWLOGTI\()[^)]+(?=\))'
Я не уверен, подходит ли этот подход для вашей цели, хотя.
Большое спасибо fra-san за , предложившего улучшения на этот ответ:)