두 목록의 두 값을 비교합니다.

두 목록의 두 값을 비교합니다.

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

관련 정보