remove as linhas que contêm o intervalo de IP da coluna específica ao fazer exclusões ao intervalo

1

Eu tenho um arquivo de log com o seguinte formato:

Jul 13 21:47:41 192.168.100.254 "user from 192.168.100.101"

Eu preciso remover TODAS as linhas que contenham IPs no intervalo 192.168.x.x, mas somente se elas aparecerem na quarta coluna.

Eu também preciso excluir 3 IPs do intervalo 192.168.x.x. Vamos chamar estes

192.168.125.100
192.168.126.100
192.168.155.240 

Como posso terminar esse comando para encontrar todos os IPs no intervalo 192.168.x.x na quarta coluna e remover todas as linhas, exceto as que contêm 192.168.125.100, 192.168.126.100 e 192.168.155.240.

awk '{print $4}' file | grep '192.168' | "remove all found except" | > save back to original file
    
por user53029 14.07.2016 / 00:30

1 resposta

6

Tente:

awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file

Exemplo

Considere este arquivo de teste:

$ cat file
Jul 13 21:47:41 192.168.100.254 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.125.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.126.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.155.240 "user from 192.168.100.101"
Jul 13 21:47:41 123.456.789.240 "user from 192.168.100.101"

Pelo que entendi, você quer manter todos, exceto a primeira linha acima.

$ awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file
Jul 13 21:47:41 192.168.125.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.126.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.155.240 "user from 192.168.100.101"
Jul 13 21:47:41 123.456.789.240 "user from 192.168.100.101"

Versão multilinha

Para aqueles que preferem o código espalhado por várias linhas:

awk '
  {
    f=1
  }

  $4 ~ /^192.168/ {
    f=0
  }

  $4 ~ /192.168.(125.100|126.100|155.240)/ {
    f=1
  }

  f
  ' file

Como funciona

O código usa uma única variável f . Se uma linha deve ser mantida, definimos f=1 . Caso contrário, f é definido como zero.

  • f=1

    Para começar, assuma que a linha deve ser mantida.

  • $4 ~ /^192.168/{f=0}

    Se $4 começar com 192.168 , marque a linha como uma que devemos perder.

  • $4 ~ /192.168.(125.100|126.100|155.240)/{f=1}

    Para esses três casos especiais, marque a linha como detentora: f=1 .

  • f

    Esta é uma abreviação enigmática do awk para: se f for verdadeiro (diferente de zero), imprima a linha.

Teste adicional

De acordo com os comentários, tentaremos o arquivo2:

$ cat file2
Jul 13 21:47:41 192.168.100.125 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.202.150 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.101.45 "user from 192.168.100.101"

Agora, vamos executar nosso comando:

$ awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file2
$ 

Todas essas linhas foram removidas como deveriam.

    
por 14.07.2016 / 00:42