2つのリストの2つの値を比較します。

2つのリストの2つの値を比較します。

2つの文字列を比較しようとしています。ある値は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

関連情報