루프가 작동하지 않거나 작동하지 않으면 awk

루프가 작동하지 않거나 작동하지 않으면 awk

아래 소스 파일을 구문 분석하려고합니다. =====와 ENDTIME 사이의 텍스트를 추출하려고 합니다. 아래 코드를 별도의 블록에서 사용하고 있습니다. 하지만 ||를 사용하면 여러 패턴을 필터링할 수 없습니다. 그러나 awk if 블록에서 단일 모드를 사용하면 필터링이 가능합니다. 누군가 이 명령에 어떤 문제가 있는지 알려줄 수 있나요? 또는 블록이 작동하지 않는 이유는 무엇입니까?

소스 파일:

STARTTIME --- 2019/09/19 12:00:44
==================================================================
Processname                                Node   Status   QueueAv
==================================================================
RtpNm01                                   CE_01      run      full
RtpAcp01                                  CE_01      run      full
RtpDynManLite01                           CE_01      run      full
RtpDynLiteInc01                           CE_01      run      full
ENDTIME --- 2019/09/19 12:00:45
Expected Result:
RtpNm01                                   CE_01      run      full
RtpAcp01                                  CE_01      run      full
RtpDynManLite01                           CE_01      run      full
RtpDynLiteInc01                           CE_01      run      full

암호:

cat rtpServiceStatusrun | awk '/Processname\s*Node\s*Status\s*QueueAv/{
while (getline){
        if( $0 !~ /^====*/ || $0 !~ /^ENDTIME*/ ){
                        print $0
                }
        }
}'

답변1

가지다많은이를 수행하는 방법은 다음과 같습니다.

$ awk '/^ENDTIME/ {next}; NR>4' sourcefile 
RtpNm01                                   CE_01      run      full
RtpAcp01                                  CE_01      run      full
RtpDynManLite01                           CE_01      run      full
RtpDynLiteInc01                           CE_01      run      full

그러면 모든 입력 줄이 인쇄됩니다.뒤쪽에로 시작하는 줄을 제외한 네 번째 줄입니다 ENDTIME.

내 생각에는 이것이 블록 while (getline)의 이상한 루프로 수행 하려는 작업이라고 생각 /Processname\s*....../합니다. 그렇게 할 필요는 없습니다. awk는 이미 각 입력 라인을 통해 루프를 수행하고 NR(현재 입력 라인 번호) 값을 테스트할 수 있습니다.

그리고:

awk '! /^(STARTTIME|ENDTIME|=====|Processname)/' sourcefile

grep -vE '^(STARTTIME|ENDTIME|=====|Processname)' sourcefile

sed -E -e '/^(STARTTIME|ENDTIME|=====|Processname)/d' sourcefile

이들 모두는 모든 줄을 인쇄합니다.아니요정규식을 일치시킵니다. 둘 다 동일한 확장 정규식(ERE - 및 둘 다 awk에 대해 기본적으로 활성화됨 -E)을 사용하여 행 시작 부분에서 대체(앵커에 대한)를 찾습니다.grepsed^

그리고:

sed -e '1,4d; $d' sourcefile

첫 번째부터 네 번째 및 마지막 행을 삭제합니다.

답변2

한 가지 옵션:

cat file | head -n -1 | tail -n +5

답변3

(&&)를 추가하기 위해 또는 (||)를 변경했고 작동하기 시작했습니다.

cat rtpServiceStatusrun | awk '/Processname\s*Node\s*Status\s*QueueAv/{
while (getline){
        if( $0 !~ /^====*/ && $0 !~ /^ENDTIME*/ ){
                        print $0
                }
        }
}'

관련 정보