Awk 基于公共匹配模式筛选行(用户未知)

Awk 基于公共匹配模式筛选行(用户未知),awk,sed,grep,Awk,Sed,Grep,我的目标是找到与源ip和目标ip匹配的规则号 例如: Source.IP--10.44.68.252 目的地——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” 设置nat源规则39源地

我的目标是找到与源ip和目标ip匹配的规则号

例如:

Source.IP--10.44.68.252
目的地——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”
设置nat源规则39源地址“10.112.140.155/32”
设置nat源规则1008源地址“10.112.140.155/32”
设置nat源规则1010源地址“10.112.140.155/32”
设置nat源规则1036目标地址“10.44.68.252/32”
设置nat源规则1037目标地址“10.44.68.252/32”
设置nat源规则1099源地址“10.112.140.155/32”
设置nat源规则1104源地址“10.112.140.155/32”
设置nat源规则1515目标地址“10.44.68.252/32”
设置nat源规则1515源地址“10.112.140.155/32”
设置nat源规则1516目标地址“10.44.68.252/32”
设置nat源规则1517源地址“10.112.140.155/32”
设置nat源规则1520源地址“10.112.140.155/32”

在grep中尝试了多个选项。没人帮忙。sed可能会有所帮助。但是我不知道sed。

一些巴沙尔主义,但这应该可以做到:

sort-uk5 data.txt>&dat&&join-j5尝试以下操作:

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

1515

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建议的解决方案这里是一个AWK解决方案:

awk-v sq=“”“-v src=10.112.140.155-v dst=10.44.68.252”
开始{
s_regex=sq src”/“d_regex=sq dst”/”
}
/源地址/&$8~s_regex{s[si]=$5;si++}
/目标地址/&$8~d_regex{d[di]=$5;di++}
结束{
对于(s中的i)对于(j中的d)如果(s[i]==d[j]){print s[i]}
}
'文件名
说明:

  • 对于匹配源地址或目标地址的行和匹配IP的第8个字段,分别将第5个字段中的规则添加到数组s或d中。这些数组分别跟踪与源或目标匹配的规则编号
  • 在结束块中,循环遍历两个数组,以找到在两个数组中都看到该规则的第一个引用
  • 感谢@sjsam使用AWK变量的想法

你能从
test.txt
)中发布一些原始的、未过滤的(带有
grep
)数据(当然包括所需的部分)吗?@JamesBrown推测,这些都是
iptables
规则,不会给op带来固定列数据的奢侈。sed是用来做
s/old/new/
,仅此而已。这不是您想要做的,因此您不应该考虑使用sed。同一
规则
值是否可以多次显示为源或目标?e、 g.您可以将
1515
作为同一IP地址的源代码列出两次吗?您可以使用awk,您可以使用
cat grep awk
组合进行任何操作。由于缺少锚点和
的意思是“任何字符”,这将导致错误匹配失败,并且会产生相同的(但错误)如果IP地址在输入中的上下文中被翻转,则输出(即源地址仅显示为dest,反之亦然)。@EdMorton Great!实现了!谢谢:-)嗯,即使从未记录为目的地,但它作为源显示了两次,也不会将规则报告为匹配吗?我认为您需要的不仅仅是
found[]
数组来分别跟踪给定规则的src和dest。我想对于每个src/dest,idk,规则可能是唯一的。在如何以健壮、高效和便携的方式实现这一点上,您无疑走上了正确的道路。@EdMorton确实如此,原因也是一样的。我想把这个答案作为一个评论。但是看到
grep
输出,似乎没有两个记录可以具有相同的规则编号,除非它具有不同类型的地址(源/目标)。这是我的一个假设。在任何情况下,知道存在重复项的规则编号在这里都是非常有用的,因为op可以随心所欲地修改这些规则。让更好的感觉占上风:-)我在评论中问过OP,我们看看她说什么。就我们目前所知,这无疑是迄今为止最好的答案。