我的目标是找到与源 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。
一个
div class="one_answers">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>
试试这个:
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 变量的想法。