파일의 각 일치 항목에 대해 현재 및 다음 20줄을 삭제하려면 무엇을 사용할 수 있습니까?

파일의 각 일치 항목에 대해 현재 및 다음 20줄을 삭제하려면 무엇을 사용할 수 있습니까?

큰 파일(스레드 덤프)이 있습니다. 명명된 스레드가 여러 개 있고 my-thread-\d+대기 중인 경우 해당 줄과 다음 20줄을 파일에서 제거하고 싶습니다.

예를 들어 다음과 같은 줄이 있을 수 있습니다.

"my-thread-1" #628 prio=5 os_prio=0 cpu=54888.61ms elapsed=194386.85s allocated=80325M defined_classes=4 tid=0x00007f406000c9d0 nid=0xb873 waiting on condition [0x00007f3faaeed000] 다음은 내가 원하지 않는 20줄입니다.

이 패턴은 파일에 여러 번 나타납니다. my-thread-매번 20줄을 삭제하는 파일에 대해 명령을 실행하고 싶습니다 waiting on conditon.

답변1

그리고 awk:

awk '/my-thread-[[:digit:]]/ && /waiting on condition/ {skip = 21}
     skip-- <= 0'

건너뛴 행 내에 다른 대기 스레드가 나타나면 skip21로 재설정되고 거기에서 21행을 다시 건너뜁니다.

다음을 사용하십시오 pcregrep(단, 줄 내에서 더 이상 대기 중인 스레드 건너뛰기는 무시).

pcregrep -Mv 'my-thread-\d.*waiting on condition(.*\n){20}'

답변2

이 경우 grep유틸리티는 거의 쓸모가 없습니다. 이전 행의 일치를 기반으로 행을 제외할 수 있는 방법이 없기 때문입니다( -A일부 구현에서는 사용 가능한 옵션의 의미를 일종의 부정합니다 grep).

나는 패턴이 다시 일치하는지 확인하기 위해 해당 20줄을 보지 않고 일치하는 줄과 다른 20줄을 건너뛰고 싶다는 요청으로 해석했습니다.

이를 사용하는 간단한 방법 sed은 다음 20개 라인을 편집 버퍼에 추가하고 입력에서 트리거 패턴이 발생할 때마다 모두 삭제하는 것입니다.

sed '/^"my-thread-[[:digit:]]\{1,\}".*waiting on conditon/ { N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;d; }' file

우리가 옳을 수 있습니다 awk.

awk '/^"my-thread-[[:digit:]]+".*waiting on conditon/ { for (i=0; i<20; ++i) getline; next }; 1' file

또는 이제 awk어느 행에 있는지 알았으므로 앞으로 20행을 건너뛸 수 있습니다.

awk 'FNR < skip_to { next } /^"my-thread-[[:digit:]]+".*waiting on conditon/ { skip_to = FNR+21; next }; 1' file

위 코드에서 는 FNR현재 파일의 줄 번호를 포함하는 특수 변수입니다. skip_to이는 패턴 일치가 트리거될 때 점프하려는 줄 번호입니다 .

답변3

awk '/my-thread-.*waiting on condition/{c=21} !(c&&c--)' file

예를 들어:

$ seq 20 | awk '/3/{c=6} !(c&&c--)'
1
2
9
10
11
12
19
20

$ seq 20 | awk '/3/{c=11} !(c&&c--)'
1
2

바라보다인쇄를 위해 sed- 또는 awk-a-line-follow-a-matching-pattern을 사용하십시오.더 자세히 알아보고 기타 관련 관용어를 알아보세요.

관련 정보