我正在尝试比较两个字符串。一个值来自iptables
我保存先前记录的文件,另一个值来自我保存的先前记录。
我想确定 iptables 中是否出现了新用户。如果是,我会将该记录添加到我的文件中。
这是我到目前为止所尝试过的。
chain=$(/usr/sbin/iptables -vnL | grep "references" | awk '{print $2}')
file=/data/..../2011-11.txt
for i in $chain
do
while IFS=',' read -r f1 f2 f3 f4 f5
do
user=$f1
if [ $i == "$user" ]; then
echo "user matched $user"
elif [ $i != $user ]; then #a new user
echo "new user $i"
break
fi #user matching if
done < "$file"
done #reading data from the file for loop
我的 iptables 看起来像(链)
NalindaChainksSdt
KasunikaChainyCehf
KivinduChainmzWeN
KumudikaChainsXcAp
LocalServerChainRyqvv
文件值为(文件)
NalindaChainksSdt
KasunikaChainyCehf
这里的脚本应该忽略链中的NalindaChainksSdt
名称KasunikaChainyCehf
。 (用户匹配)
但这并不能解决问题。它只是将文件中的所有用户标识为新用户。
我在这里缺少什么?
答案1
首先,说这样的话毫无意义
如果状况;然后 做一点事 埃利夫状况是假的;然后 做一些不同的事情 菲
因为如果condition
不是真的,那么你就知道它是假的。你可以说
如果状况;然后 做一点事 别的 做一些不同的事情 菲
现在考虑一下脚本的逻辑。这是一个n2算法——或者更准确地说,如果$chain
是米字长,文件是n行长,那么代码可能会循环米×n次。现在考虑一下这对您的问题意味着什么:
如果你发现的话,你就说这$i
是一个新用户任何文件中的user ( $user
) 不同。但$i
只有在以下情况下才是新用户:每一个文件中的用户不同于$i
.
答案2
我可以使用 util 提供最简单的解决方案comm
:
#!/bin/bash
/usr/sbin/iptables -vnL | grep "references" | awk '{print $2}' > /tmp/chain
chain="/tmp/chain"
file="full path to 2011-11.txt"
comm -13 "$file" "$chain"
如果2011-11.txt
包含:
NalindaChainksSdt
KasunikaChainyCehf
并chain
包含:
NalindaChainksSdt
KasunikaChainyCehf
KivinduChainmzWeN
KumudikaChainsXcAp
LocalServerChainRyqvv
然后输出将是:
KivinduChainmzWeN
KumudikaChainsXcAp
LocalServerChainRyqvv