아래 소스 파일을 구문 분석하려고합니다. =====와 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
)을 사용하여 행 시작 부분에서 대체(앵커에 대한)를 찾습니다.grep
sed
^
그리고:
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
}
}
}'