比较两个列表中的两个值

比较两个列表中的两个值

我正在尝试比较两个字符串。一个值来自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

相关内容