1

1

awk를 사용하여 로그 파일을 필터링하려고 합니다. 필터링은 이제 시간 기반이며, 시간 범위를 벗어나는 로그 파일 항목은 삭제되지만 해당 범위 내의 항목은 유지됩니다. 이제 특정 시간 범위 내에 있는 항목을 발견하면 모든 후속 항목도 해당 시간 범위 내에 있다는 것을 알고 있습니다.

그러면 더 이상 확인이 필요하지 않습니다. 그러면 awk가 이를 깔끔하게 수행할 수 있는 방법이 있습니까? 내 말은 플래그 변수를 사용하여 더 이상 검사가 없음을 나타내고 각 줄을 인쇄할 수 있다는 뜻입니다. 하지만 "나머지 모든 행을 처리하세요"라고 말할 수 있는 방법이 있나요?

답변1

awk 'flag == 0 || some_test { flag = 1 } flag == 1 { processing }'

이는 부울/이진 "플래그"를 사용하여 처리가 파일 끝까지 계속될 수 있는 시기를 추적합니다.

첫 번째 블록은 데이터에서 처리가 시작될 수 있는 지점을 테스트합니다. 문제는 some_test이미 기존 테스트가 있다는 것입니다. 얼마나 걸릴까요 flag == 0. 테스트가 true이면 플래그가 전환되어 1테스트가 비활성화되고 processing차단이 활성화됩니다.

마지막 블록은 사용자를 트리거한 첫 번째 줄부터 some_test파일 끝까지 모든 줄에 대해 실행됩니다.

답변2

귀하의 로그에 있는 시간이 오름차순으로 정렬되어 있다고 가정합니다.

"일단 시간 범위 내에 있는 항목을 발견하면 다음 항목도 모두 해당 시간 범위 내에 있음을 알고 있습니다"라는 조건은 다음과 같이 작성할 수 있습니다.

1

time >= start_of_range , 0 { print }

어디:

  • time처리 중인 행에서 시간을 추출하는 필드 또는 표현식입니다.

  • start_of_range처리 시간 범위의 최소값입니다.

  • ,Awk가 ranges를 이해하는 방식으로 a를 표현하면 range, the의 왼쪽이 ,처음으로 true일 때 시작하고 the의 오른쪽이 ,true일 때 끝납니다. 이 경우 never(0)은 오른쪽 명령을 끝까지 모든 후속 라인에 적용합니다 print.

awk 스크립트의 첫 번째 줄에 다음을 입력하세요.

awk '$7 >= "2015-08-12" , 0 { print }'

실제 모드(일치 범위)의 기본 동작이므로 인쇄도 제거할 수 있습니다.

awk '$7 >= "2015-08-12" , 0'

2

또 다른 접근 방식은 테스트를 교체하고 다음을 수행하는 것입니다.

awk '$7 < "2015-08-12" {next}
     {print}
    ' file

간단히 다음과 같이 작성할 수 있습니다.

awk '$7 < "2015-08-12" {next} 1' file

그러나 모든 라인에 대한 테스트는 계속해서 평가될 것입니다.

답변3

1.네, 사용하세요범위0or 로 종료 조건 ""(= false, 일치하지 않음):

awk '<is_within_the_range>, 0'

<is_within_the_range>다른 범위를 제외한 모든 표현식이 될 수 있는 조건은 어디에 있습니까?

시작 조건은 다음과 같습니다.아니요첫 번째 게임이 끝난 후 다시 평가해 보세요.

$ seq 1 6 | awk '
   function check(){ print "checking", $0; return $1 == 3 }
   check(), 0
'
checking 1
checking 2
checking 3
3
4
5
6

2.범위가 마음에 들지 않으면 C에서처럼 조건이 일치하는 한 모든 줄을 명시적으로 인쇄하여 당황하지 않고 모든 작업을 수행할 수 있습니다.

seq 1 6 | awk '$1==3 { do print; while (getline > 0) }'

삼.POSIX 표준에 따르면 또 다른 해결책은 다음과 같습니다.~해야 한다일반 검색 가능한 파일 사용(파이프가 아닙니다!), 하지만실제로 작동하지 않습니다대부분의 awk 구현에서는 모든 POSIX 유틸리티가 그렇듯이 awk를 사용하여 종료 시 마지막 레코드의 끝으로 파일 포인터를 설정합니다.요청을 받다:

seq 1 6 > file
{ awk '$1 == 3 { print; exit }'; cat; } < file

IMLE 이것은 *BSD의 "one true awk" 또는 "one true awk" 가 아닌 Solaris의 awk/ 에서만 작동합니다.nawkgawkmawk


4.마지막으로, 느린 고급 언어로 자신만의 상태 머신을 작성할 수 있습니다(예: 플래그를 설정한 다음 확인하여).이미멋지고 단순화된 인터페이스를 제공하지만 고려할 가치가 있기에는 너무 어리석습니다.

답변4

파일 줄에 PATTERN이 포함되면 해당 줄과 다음 줄이 모두 인쇄됩니다.

awk 'flag || /PATTERN/{flag=1} flag{print $0}' file

추가 처리가 필요한 경우 "print $0"을 다른 코드로 바꿀 수 있습니다.

관련 정보