Filtern einer Protokolldatei nach Anforderung

Filtern einer Protokolldatei nach Anforderung

Ich versuche, meine Protokolldatei nach Anfrage zu filtern. Ich möchte alle Anfragen filtern (die Sie in der 7. Spalte finden: /userx/index...), die diese Parameter haben (m=xxx and a=xxx)oder (m=xxx and doajax=xxx)nur die Anfrage mit diesen Parametern haben.

Zum Beispiel:

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

Ergebnis des Filters:

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

Ich habe versucht, mit diesem Befehl nach Anfragen mit m=xxx und a=xxx zu suchen, weiß aber nicht, wie ich das in anderen Fällen machen soll (wenn ich gleichzeitig m=xxx und doajax=xxx finden kann).

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

Antwort1

Was ist falsch mit

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

Wo

  • &&stehen für logisch und,
  • ||logisches oder,
  • split($7,A,"&")teilt das 7. Feld in das Array auf, wobei & als Trennzeichen verwendet wird,
  • $7 = A[1] "&" A[2]Ändern Sie (nicht in der Datei) das 7. Feld in das ausgewählte Unterfeld
  • printdrucken.

(Dies kann einzeilig sein, ich breche die Zeile der Lesbarkeit halber ab).

dies geben

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

Wenn Sie eine vollständige Zeile mit doajax: wünschen,

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

verwandte Informationen