sed\awk를 사용하여 파일에서 특정 줄을 찾은 다음 다른 패턴과 일치하는 모든 후속 줄을 일치시키려면 어떻게 해야 합니까?

sed\awk를 사용하여 파일에서 특정 줄을 찾은 다음 다른 패턴과 일치하는 모든 후속 줄을 일치시키려면 어떻게 해야 합니까?

비슷한 주제를 찾았지만 이를 직접 사용하기 위해 구현하는 방법을 모르겠습니다.

대상 라인을 일치시킨 후 여러 라인을 가져옵니다.

문제는 이것이다:

내 프로젝트에서 이것을 구현하려고 하는데 제대로 작동하지 않는 것 같습니다. 저는 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/.
  • pp: 참인 한 줄을 인쇄합니다(여기서 = 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_pat1로 설정합니다.
  • 두 번째 규칙은 다음으로 시작하는 모든 줄 -->도 인쇄된다는 것입니다.
  • 세 번째 규칙은 첫 번째 줄의 플래그를 재설정하는 데 사용됩니다.아니요패턴을 포함하거나 로 시작하지 않으면 -->패턴이 다시 발견될 때까지 아무것도 인쇄되지 않습니다.

첫 번째 규칙에서는 indexRegExp 일치 대신 함수가 사용됩니다. 이 방법을 사용하면 정규식에서 특별한 의미를 갖는 문자가 포함된 패턴을 찾을 수도 있습니다.

답변3

Perl을 사용하면 다음과 같이 작동합니다.

 perl -ne ' { $t=0 if ( !/^-->/ ); $t=1 if(/vm-1178/); print if($t); }' <filename>

관련 정보