요청으로 로그 파일 필터링

요청으로 로그 파일 필터링

요청에 따라 로그 파일을 필터링하려고 합니다. 해당 매개변수가 있는 요청만 있거나 있는 (m=xxx and a=xxx)모든 요청(7번째 열:/userx/index...에서 찾을 수 있음)을 필터링하고 싶습니다. (m=xxx and doajax=xxx)

예를 들어:

192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxxx&doajax=xxxx&action=xxxxx&id=x
192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?detailed=1&id=amgervais
192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxx&a=xxxx&dialog=x&actionId=x&prospectId=xx

필터 결과:

192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxxx&doajax=xxxx&action=xxxxx
192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxx&a=xxxx

이 명령을 사용하여 m=xxx 및 a=xxx가 있는 요청을 보려고 했지만 다른 경우(m=xxx 및 doajax=xxx를 찾을 수 있는 경우)에 대해 동시에 수행하는 방법을 모르겠습니다.

awk '$7 ~ /m=/' logfile | awk '$7 ~ /&a=/' 

답변1

무슨 일이야?

awk '( $7 ~ /m=xxx/ ) && (( $7 ~ /a=xxx ) || ( $7 ~ /doajax=xxx/ )) {
    split($7,A,"&") ; $7 = A[1] "&" A[2] ;print ;} ' logfile

어디

  • &&논리적이고,
  • ||논리적이거나,
  • split($7,A,"&")&를 구분 기호로 사용하여 7번째 필드를 배열로 분할합니다.
  • $7 = A[1] "&" A[2](파일에 없음) 7번째 필드를 선택한 하위 필드로 변경
  • print인쇄.

(이것은 한 줄로 작성할 수 있습니다. 가독성을 위해 줄을 바꿉니다.)

이건 줘

192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxxx&doajax=xxxx
192.xx.x.x - - [11/Apr/2017:09:59:xx +0200] "POST /userx/index.php?m=xxx&a=xxxx

다음과 같은 전체 라인을 원하는 경우 doajax:

 awk '/doajax/ { print ; next ; } 
 ( $7 ~ /m=xxx/ )  && ( $7 ~ /a=xxx/ ) { split($7,A,"&") ; $7 = A[1] "&" A[2] ;print ;}'

관련 정보