요청에 따라 로그 파일을 필터링하려고 합니다. 모든 요청을 필터링 (m=xxx and a=xxx)
하거나 이러한 매개변수가 있는 요청만 필터링하고 싶습니다 (m=xxx and doajax=xxx)
(7번째 열: /userx/index...에서 찾을 수 있음).
예를 들어:
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
어디
&&
논리합을 나타내고,||
논리 OR,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 ;}'