Фильтрация строк по общему шаблону сопоставления (неизвестно пользователю) - PullRequest
0 голосов
/ 14 апреля 2019

Моя цель - найти номер правила, который соответствует ip-адресу и ip-адресу

Пример:

Source.IP -- 10.44.68.252
Destination -- 10.112.140.155

Фильтрация файла конфигурации с помощью grep "10.44.68.252\|10.112.140.155" дает мне приведенный ниже список команд.

Мне нужно вручную найти и найти номер правила, в котором совпадают источник и пункт назначения. В приведенном ниже правиле вывода 1515 соответствия - это то, что я ищу.

Есть ли способ найти его в той же команде?

cat test.txt | grep "10.44.68.252\|10.112.140.155"   
set nat source rule 39 source address '10.112.140.155/32'  
set nat source rule 1008 source address '10.112.140.155/32'  
set nat source rule 1010 source address '10.112.140.155/32'  
set nat source rule 1036 destination address '10.44.68.252/32'  
set nat source rule 1037 destination address '10.44.68.252/32'  
set nat source rule 1099 source address '10.112.140.155/32'  
set nat source rule 1104 source address '10.112.140.155/32'  
set nat source rule 1515 destination address '10.44.68.252/32'  
set nat source rule 1515 source address '10.112.140.155/32'  
set nat source rule 1516 destination address '10.44.68.252/32'  
set nat source rule 1517 source address '10.112.140.155/32'  
set nat source rule 1520 source address '10.112.140.155/32'  

Пробовал несколько вариантов в grep. Никто не помог. Сед может помочь. Но я не знаю, седь.

Ответы [ 4 ]

2 голосов
/ 14 апреля 2019

Решение awk:

awk -v sq="'" -v dest=10.44.68.252 -v src=10.112.140.155 '
(index($NF,sq dest "/") && $6 == "destination") ||
(index($NF,sq src "/") && $6 == "source"){found[$5]++}
END{
for(key in found)
 if(found[key]>1)
   print key;
}
' filename

Вывод

1515

Примечание: Я бы предпочел опубликовать этов качестве комментария, за исключением его длины.Также смотрите ревизию , предложенную @ ed-morton, которую я реализовал

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

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

awk -v sq="'" -v src=10.112.140.155 -v dst=10.44.68.252 '
  BEGIN {
    s_regex = sq src "/"; d_regex = sq dst "/"
  }
  /source address/   &&    $8 ~ s_regex {s[si] = $5; si++}
  /destination address/ && $8 ~ d_regex {d[di] = $5; di++}
  END {
    for (i in s) for (j in d) if (s[i] == d[j]) {print s[i]}
  }
  ' FILENAME

Объяснение:

  • Для строк, совпадающих с адресом источника или назначения и восьмым полем, соответствующим IP, добавьте правило в 5-мполе к массиву s или d соответственно.Эти массивы отслеживают номера правил, соответствующие источнику или получателю соответственно.
  • В блоке END выполните цикл по обоим массивам, чтобы найти первое вхождение, где это правило было замечено в обоих массивах.
  • Благодарности@sjsam за идею использования переменных AWK.
0 голосов
/ 14 апреля 2019

попробуйте это:

cat test.txt | grep "10.44.68.252\|10.112.140.155" | awk '{ print $5 }' | uniq -d

выход

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

Несколько башмизмов, но для этого стоит:

sort -uk5 data.txt>&dat && join -j5 <(fgrep e\ ad<dat) <(fgrep n\ ad<dat) | awk '{gsub(/'"'"'/,"");print$1,$8,$NF}' | column -tR1,2,3 -N rule,src,dest

rule                src             dest
1515  10.112.140.155/32  10.44.68.252/32
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...