grep이 IP를 찾았지만 마지막 옥텟은 0이 아닙니다.

grep이 IP를 찾았지만 마지막 옥텟은 0이 아닙니다.

여러 네트워크에서 생성된 목록에서 IP를 추출하려고 하는데 해당 IP를 격리해야 합니다.원하지 않는다0으로 끝납니다.

예를 들어 아래 목록에는 텍스트, 일반 IP, IP 범위가 있습니다. 내가 원하는 것은 0이나 서브넷 마스크로 끝나는 IP가 아닌 일반 IP만 얻는 것입니다.

; Spamhaus DROP List 2016/07/03 - (c) 2016 The Spamhaus Project
; http://www.spamhaus.org/drop/drop.txt
; Last-Modified: Sun,  3 Jul 2016 21:18:32 GMT
; Expires: Sun, 03 Jul 2016 23:26:45 GMT

1.0.1.0/24
223.223.176.0
129.130.100.100
1.160.118.30

내가 달리면grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'

그것은 나에게 다음을 제공합니다:

1.0.1.0
223.223.176.0
129.130.100.100
1.160.118.30

정규식의 마지막 부분을 다음으로 바꾸려고했습니다.

grep -Eo '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[^1-255]'

하지만 작동하지 않습니다.

검색 프로세스 속도를 높이기 위해 grep(또는 sed/awk)에 대한 여러 파이프라인 사용을 최소화하려고 노력하고 있습니다. 예를 들어, 내가 피하고 싶은 것은 다음과 같습니다.

grep <all IPs from list> | grep -v <all those that end in 0 or subnet> 

이러한 IP를 얻기 위해 한 줄에 grep/sed/awk를 사용할 수 있습니까? 위의 예에서 결과는 다음과 같아야 합니다.

129.130.100.100
1.160.118.30

감사해요

답변1

당신은 시도 할 수 있습니다 awk:

$ awk -F . '$NF !~ /^0/' <file
129.130.100.100

답변2

질문의 원래 버전에 대한 답변

$ awk -F'[./]' '($4+0) != 0' iplist
129.130.100.100

어떻게 작동하나요?

  • -F'[./]'

    그러면 필드 구분 기호가 .또는 로 설정됩니다 /. 이렇게 하면 마지막 옥텟은 항상 필드 4가 됩니다.

  • ($4+0) != 0

    이 논리 조건은 네 번째 옥텟이 다음과 같은 경우 참으로 평가됩니다.아니요0. 이 경우 명시적인 작업을 포함하지 않았으므로 awk는 행을 인쇄하는 기본 작업을 수행합니다.

    0awk가 문자열 비교가 아닌 숫자 비교를 수행하도록 하기 위해 네 번째 필드를 추가합니다 .

답변3

grep -E '^([0-9]{1,3}\.){3}[1-9][0-9]{0,2}$'

[1-9]마지막 옥텟의 첫 번째 숫자가 0이 아닌지 확인합니다. 선택적 다음 숫자는 다음 0( 129.130.100.100)과 여전히 일치할 수 있음을 의미합니다.

$줄이 마지막 옥텟 다음에 끝나도록 하여 서브넷 마스크와 일치하지 않도록 하십시오.

[^1-255]다음과 같은 여러 가지 이유로 원하는 것을 수행하지 못하고 있습니다.

  • 숫자가 아닌 문자를 다룹니다. "( 1사이에 2) OR 5OR 5"를 의미합니다.
  • ^방법"아니요이 범위 내에서”

따라서 마지막 옥텟이 1, 2 또는 5로 시작하는 모든 항목을 제외하고 나머지와 일치합니다.

관련 정보