두 문자열을 비교하려고합니다. 한 값은 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