비슷한 주제를 찾았지만 이를 직접 사용하기 위해 구현하는 방법을 모르겠습니다.
문제는 이것이다:
내 프로젝트에서 이것을 구현하려고 하는데 제대로 작동하지 않는 것 같습니다. 저는 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}
p
: 행이 일치할 때마다 var = 1을 설정합니다/vm-1178/
.p
p
: 참인 한 줄을 인쇄합니다(여기서 = 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>