grep -Ef는 두 파일에서 일치하는 IP 주소를 캡처하고 각 반복의 결과(xx.xx.xx.xx 찾음 또는 xx.xx.xx.xx 찾을 수 없음)를 인쇄하거나 에코합니다.

grep -Ef는 두 파일에서 일치하는 IP 주소를 캡처하고 각 반복의 결과(xx.xx.xx.xx 찾음 또는 xx.xx.xx.xx 찾을 수 없음)를 인쇄하거나 에코합니다.

저는 수백 개의 IP 주소로 구성된 짧은 목록을 가지고 file1있으며 이러한 IP 주소 중 기본 목록에서 누락된 주소가 있는지 확인하고 싶습니다 file2. 출력 > 두 경우의 결과를 인쇄하는 파일로 리디렉션을 찾으세요. 예를 들면 다음과 같습니다.

xx.xx.xx.xx missing
xx.xx.xx.xx found

6개의 유사한 질문을 검토하고 많은 것을 배웠지만 기존 질문 중 어느 것도 내 질문에 완전히 대답하지 않아서 직접 만들었습니다.

awk두 가지를 모두 사용하여 여러 가지 접근 방식을 시도했지만 grep -F -f비교 결과를 조정하고 논리적 설명을 작성하는 데 문제가 있습니다.

6개의 기존 답변을 검토하고 많은 것을 배웠지만 그 중 어느 것도 내가 이해하는 방식으로 정확하게 내 목표를 해결하지 못했습니다.

답변1

while 루프를 사용하세요:

while IFS= read -r i; do
  grep -Fq "$i" file && echo "$i found" || echo "$i missing"
done <ip_addresses

  • while파일의 각 줄을 반복합니다.ip_addresses
    • grep -Fq-F어떤 문자와도 일치하지 않는 일치 항목이 포함된 행을 고정 문자열( )에서 검색합니다 . 이 -q플래그는 grep아무것도 인쇄되지 않도록 합니다.
    • && echo "$i found"성공 하면 grep주소를 찾았습니다.
    • || echo "$i missing"그렇지 않다면 누락된 것입니다.

답변2

file이 l1알 수 없는 IP 주소를 포함하는 목록이고 file이 l2기본 목록이라고 가정합니다.

l1다음은 다음에만 있고 다음에는 없는 모든 IP 주소 목록입니다 l2.

egrep -v "`cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'`" l1

옵션을 제거하면 및 에 나타나는 모든 IP 주소가 -v나열됩니다 .l1l2

egrep "`cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'`" l1

두 파일 모두 형식이 동일 l1해야 합니다 .l2

다음 명령:

cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'

|파일 내용에서 구분된 IP 주소 목록을 만듭니다 l2. 에 전달된 정규식의 문자입니다 |.oregrep

파일로 테스트:

$ cat l1
192.168.0.10
192.168.2.14
192.168.0.11
192.168.0.9

$ cat l2
10.64.10.200
192.168.4.0
192.168.2.3
192.168.0.10
192.168.0.11
192.168.1.0
192.168.2.0

분실된 IP 주소 찾기:

$ egrep -v "`cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'`" l1
192.168.2.14
192.168.0.9

중복된 IP 주소 찾기:

$ egrep  "`cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'`" l1
192.168.0.10
192.168.0.11

파일이 너무 길어서 최대 명령줄 길이를 초과하지 않기를 바랍니다. :-(

관련 정보