Пользовательское приглашение bash - проблема с позиционированием курсора [дубликат]

Попробуйте:

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
$ 

Все эти строки были удалены, как и должно быть.

1
06.06.2015, 15:33
0 ответов

Теги

Похожие вопросы