基于常见匹配模式过滤行(用户未知)



我的目标是找到与源 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 中尝试了多个选项。没有帮助。SED可能会有所帮助。但我不知道sed。

一个

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 建议的修订<</sub>

div class="one_answers">

试试这个:

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

输出

1515

一些 bashisms,但这应该这样做:

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

这是一个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 匹配的第 8 个字段,请将第 5 个字段中的规则分别添加到数组 s 或 d 中。这些数组分别跟踪与源或目标匹配的规则编号。
  • 在 END 块中,遍历两个数组以查找在两个数组中都看到该规则的第一个匹配项。
  • 感谢@sjsam使用 AWK 变量的想法。

相关内容

最新更新