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 com192.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.