비슷한 주제를 찾았지만 이를 직접 사용하기 위해 구현하는 방법을 알 수 없습니다.
문제는 다음과 같습니다.
내 프로젝트에 구현하려고 하는데 제대로 작동하지 않는 것 같습니다. 저는 Linux를 사용하고 있습니다. 누군가 이를 분해할 수 있습니까?
기본적으로 내가 하려는 일은 로그 번들을 살펴보고 스택\세부 사항과 함께 특정 줄을 캡처하는 것입니다. 예는 다음과 같습니다.
2020-01-20T05:58:19.119Z verbose vpxa[6E21B70] [Originator@6876 sub=PropertyProvider opID=k5cokp1a-928316-auto-jwal-h5:70047736-92-01-84] [CommitChangesAndNotify] Updating cached values
2020-01-20T05:58:19.119Z info vpxa[6E21B70] [Originator@6876 sub=Default opID=k5cokp1a-928316-auto-jwal-h5:70047736-92-01-84] [VpxLRO] -- ERROR task-107599 -- **vm-1178** -- vim.VirtualMachine.reconfigure: vmodl.fault.InvalidArgument:
--> Result:
--> (vmodl.fault.InvalidArgument) {
--> faultCause = (vmodl.MethodFault) null,
--> faultMessage = (vmodl.LocalizableMessage) [
--> (vmodl.LocalizableMessage) {
--> key = "msg.disk.extendFailure",
--> arg = (vmodl.KeyAnyValue) [
--> (vmodl.KeyAnyValue) {
패턴이 변경될 때까지 "vm-1178"을 포함하는 모든 줄과 "-->"로 시작하는 모든 후속 줄을 캡처한 다음 다음에 이 문제가 발생할 때까지 vm-1178을 찾기 시작합니다.
그것이 의미가 있기를 바랍니다. 감사해요!
답변1
이 시도,
awk '!/^-->/{p=0} /vm-1178/{p=1} p'
!/^-->/{p=0}
:p
줄이 로 시작하지 않을 때마다 var(print와 유사)를 0으로 설정합니다-->
./vm-1178/{p=1}
: 줄이 일치할 때마다 varp
= 1 로 설정합니다/vm-1178/
.p
p
: true 일 때마다 줄을 인쇄합니다 (여기=1).
답변2
awk
해당 목적으로 사용할 수 있습니다 .
awk 'index($0,"vm-1178")>0 {in_pat=1; print; next} \
in_pat == 1 && $0 ~ /^-->/ {print; next} \
{in_pat=0}' logfile.txt
여기에는 세 가지 규칙이 포함됩니다.
- 첫 번째 규칙은 패턴이 포함된 행을 찾아 이를 인쇄하고 내부 플래그를
in_pat
1로 설정합니다. - 두 번째 규칙은 다음으로 시작하는 모든 줄
-->
도 인쇄된다는 것입니다. - 세 번째 규칙은 첫 번째 줄에서 해당 플래그를 재설정하는 데 사용됩니다.~ 아니다패턴을 포함하거나 로 시작하지 않으므로
-->
패턴을 다시 찾을 때까지 아무것도 인쇄되지 않습니다.
첫 번째 규칙에서는 index
RegExp 일치 대신 함수가 사용됩니다. 이는 정규식에서 특별한 의미를 갖는 문자가 포함된 패턴도 찾을 수 있도록 하기 위한 것입니다.
답변3
Perl을 사용하면 다음과 같이 작동합니다.
perl -ne ' { $t=0 if ( !/^-->/ ); $t=1 if(/vm-1178/); print if($t); }' <filename>