Попробуйте:
awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file
Рассмотрим этот тестовый файл:
$ 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"
Как я понимаю ваши правила, вы хотите оставить все, кроме первой строки выше.
$ 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"
Для тех, кто предпочитает, чтобы их код был разбит на несколько строк:
awk '
{
f=1
}
$4 ~ /^192.168/ {
f=0
}
$4 ~ /192.168.(125.100|126.100|155.240)/ {
f=1
}
f
' file
Код использует единственную переменную f
. Если необходимо сохранить строку, мы устанавливаем f=1
. В противном случае f
устанавливается равной нулю.
f=1
Для начала предположим, что строка должна быть сохранена.
$4 ~ /^192.168/{f=0}
Если $4
начинается с 192.168
, то пометьте строку как ту, которую мы должны потерять.
$4 ~ /192.168.(125.100|126.100|155.240)/{f=1}
Для этих трех особых случаев пометьте линию как сохраняющую: f=1
.
f
Это криптографическое сокращение awk, означающее: если f
истинно (ненулевое значение), то выведите строку.
Согласно комментариям, мы попробуем файл2:
$ 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"
Теперь выполним нашу команду:
$ awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file2
$
Все эти строки были удалены, как и должно быть.