Найти строку без ключевого слова / в заданных парах линий - PullRequest
2 голосов
/ 25 апреля 2019

Попытка отфильтровать политику безопасности брандмауэра, для которой не включен журнал.

Я только что GREPed политику, которая обеспечивает вывод политик, соответствующих "и действие и параметры журнала". Но я не знаю никаких механизмов фильтрации.

#zcat config.gz | egrep permit\|deny\|log | grep policy 
set security policies from-zone Trust to-zone Untrust policy 44 then permit  
set security policies from-zone Trust to-zone Untrust policy 44 then log session-init  
set security policies from-zone Trust to-zone Untrust policy 34 then permit  
set security policies from-zone Trust to-zone Untrust policy 34 then log session-init  
set security policies from-zone Trust to-zone Untrust policy 82 then permit  
set security policies from-zone Trust to-zone Untrust policy 82 then log session-init  
set security policies from-zone Trust to-zone Untrust policy 82 then log session-close  
set security policies from-zone Trust to-zone Untrust policy 73 then deny  
set security policies from-zone Trust to-zone Untrust policy 73 then log session-close  
set security policies from-zone Trust to-zone Untrust policy 72 then deny  
set security policies from-zone Trust to-zone Untrust policy 72 then log session-close  
set security policies from-zone Trust to-zone Untrust policy 67 then permit  
set security policies from-zone Trust to-zone Untrust policy 53 then permit  
set security policies from-zone Trust to-zone Untrust policy 53 then log session-init  
set security policies from-zone Trust to-zone Untrust policy 30 then deny  
set security policies from-zone Trust to-zone Untrust policy 30 then log session-close  
set security policies from-zone Trust to-zone Untrust policy 75 then permit  
set security policies from-zone Trust to-zone Untrust policy 75 then log session-init  
set security policies from-zone Trust to-zone Untrust policy 76 then permit  
set security policies from-zone Trust to-zone Untrust policy 28 then permit  
set security policies from-zone Trust to-zone Untrust policy 28 then log session-init  
set security policies from-zone Trust to-zone Untrust policy 50 then permit  
set security policies from-zone Trust to-zone Untrust policy 50 then log session-init  
set security policies from-zone Trust to-zone Untrust policy 51 then permit  
set security policies from-zone Trust to-zone Untrust policy 51 then log session-init  
set security policies from-zone Trust to-zone Untrust policy 55 then permit  
set security policies from-zone Trust to-zone Untrust policy 55 then log session-init  
set security policies from-zone Trust to-zone Untrust policy 56 then permit  
set security policies from-zone Trust to-zone Untrust policy 79 then permit  
set security policies from-zone Trust to-zone Untrust policy 79 then log session-init  
set security policies from-zone Trust to-zone Untrust policy 57 then permit  
set security policies from-zone Trust to-zone Untrust policy 57 then log session-init  
set security policies from-zone Trust to-zone Untrust policy 58 then permit  
set security policies from-zone Trust to-zone Untrust policy 58 then log session-init

Я хотел бы знать политики, в которых не включен журнал.

Пример: «Политика 67» имеет только разрешение, но не зарегистрировано Имя политики должно быть отфильтровано и отображено.

Ответы [ 6 ]

3 голосов
/ 25 апреля 2019

С GNU awk для истинных многомерных массивов:

$ cat tst.awk
/permit|deny|log/ && /policy/ { present[$9][$11] }
END {
    for (policy in present) {
        if ( !( "log" in present[policy] ) ) {
            print policy
        }
    }
}

$ awk -f tst.awk file
56
67
76

С любым awk:

$ cat tst.awk
/permit|deny|log/ && /policy/ { policies[$9]; present[$9,$11] }
END {
    for (policy in policies) {
        if ( !( (policy,"log") in present ) ) {
            print policy
        }
    }
}

С помощью вышеуказанного подхода вы можете написать if операторов для проверки любых комбинаций состояний, которые вам нравятся для каждой политики.

1 голос
/ 25 апреля 2019

Использование awk в одном вызове:

zcat config.gz | awk '
$8 == "policy" {
  if ($11 ~ /permit|deny/ && !($9 in log_enabled))
    policies[$9]
  else if ($11 == "log") {
    log_enabled[$9]
    delete policies[$9]
  }
}
END {
  for (policy in policies)
      print "policy", policy
}'

Если должно быть хотя бы в одном действии на политику, становится проще:

zcat config.gz | awk '
/policy.*(permit|deny|log)/ {
  policies[$9]++
}
END {
  for (policy in policies)
    if (policies[policy] == 1)
      print "policy", policy
}'
0 голосов
/ 25 апреля 2019

Для тех, кто предпочитает двухпроходное решение:

$ awk 'NR==FNR {if (/then log/) logging[$9]; next} 
       /then (permit|deny)/ && !($9 in logging)' file file

set security policies from-zone Trust to-zone Untrust policy 67 then permit
set security policies from-zone Trust to-zone Untrust policy 76 then permit
set security policies from-zone Trust to-zone Untrust policy 56 then permit

Или, если вы просто хотите напечатать часть строки:

$ awk 'NR==FNR {if (/then log/) logging[$9]; next} 
       /then (permit|deny)/ && !($9 in logging) {print $8,$9}' file file

policy 67
policy 76
policy 56
0 голосов
/ 25 апреля 2019

Вот решение AWK:

/policy.*(permit|deny|log)/ {
  policy = $0
  gsub(/.*then /, "", policy)
  ar[$9] = ar[$9] " " policy
}
END {
  for (key in ar)
    if (ar[key] !~ /log/)
      print "policy", key, ar[key]
}

Тестирование:

$ awk -f test.awk <<< $data
policy 56  permit
policy 76  permit
policy 67  permit

Обратите внимание, что это решение имеет преимущество в сообщении как номеров политик, так и деталей политик.

0 голосов
/ 25 апреля 2019

Не могли бы вы попробовать следующее (не жестко запрограммированные значения полей для строковой политики)

awk '
match($0,/policy [0-9]+/){
  if(($NF=="permit" || $NF=="deny")|| ($(NF-1)=="log" && $NF~/session/)){
     a[substr($0,RSTART,RLENGTH)]++
  }
}
END{
  for(i in a){
     if(a[i]<2){
       print i,a[i]
     }
  }
}
'   Input_file

Вы можете удалить a[i], который дает общую сумму вхождения из приведенного выше кода в END блоке awk, если вам это не нужно.

0 голосов
/ 25 апреля 2019

С awk / sed все не так просто, потому что проблема требует просмотра нескольких строк.Одним из решений может быть:

sort -n -k9,9 stackoverflow55844671.txt | \
    awk '{if(prev==$9){
            logged += ($0 ~ / log /)
          }else{
            if(logged==0){print prev};
            prev=$9;
            logged=($0 ~ / log /)
          }
        }END{if(logged==0){print prev}}'

Сначала он сортирует строки на основе номера политики (9-е поле), затем часть awk обрабатывает каждую строку, но сохраняет значение политики и выходные данныесопоставление с образцом (не стесняйтесь изменять регулярное выражение).

Это дает мне:

56
67
76
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...