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