쉘 스크립팅을 사용하여 파일에 IP 주소가 있는지 확인하는 방법은 무엇입니까?


13

출력을 생성하는 스크립트가 있습니다. 같은 IP 주소의 출력을 확인하고 싶습니다.

159.143.23.12
134.12.178.131
124.143.12.132

if (IPs are found in <file>)
then // bunch of actions //
else // bunch of actions //

가 fgrep좋은 아이디어는?

bash를 사용할 수 있습니다.


사용 GREP은 egrep을은, AWK, 또는 무엇이든 U처럼 나오지도
— Ijaz 아마드 칸

구문에 도움을 줄 수 있습니까? 임의 IP를 어떻게 검색합니까? 패턴을 설명하는 방법? 특정 주소가 아닌 모든 IP 주소를 찾고 있습니다.
— Koshur

5
4 진수 표기법으로 된 IPv4 주소 만입니까? 그들은 다음과 같이 쓸 수 있었 0010.0000.0000.0001습니까? 파일에 버전 번호 ( soft-1.2.1100.1.tar.gz, 네트워크 사양 (10.0.0.0/24), 1.2.3.4.5) 와 같은 IP 주소처럼 보이는 것이 포함될 수 있습니까? 333.444.555.666에 긍정적 인 솔루션을 허용 하시겠습니까? 또는 0377.0377.0377.0377(유효한 4 중 IP 주소)?
— Stéphane Chazelas

bash사용 가능한 경우 awk일반적으로도 가능 하므로 다음과 같이 작동합니다. awk '/([0-9]{2,3}\.){3}/ {print $5 "\t" $1}'(이 한 줄짜리 호스트는 호스트 XFR 목록의 출력을 /etc/hosts형식으로 변환 합니다.)
— Mark Hudson

답변:


25

예, 사용할 수있는 옵션 / 도구가 많이 있습니다. 방금 이것을 시도했지만 작동합니다.

ifconfig | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"

grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"출력에서 IP 주소를 grep하는 데 사용할 수 있습니다 .


감사. 작동합니다. 조금 설명해 주시겠습니까? 정규 표현식입니까?
— Koshur

네 이것은 grep과 함께 bash에서 사용되는 정규 표현식입니다. 점으로 구분 된 세 자리 패턴을 찾고 있습니다. 당신은 2 연속 숫자 등을 위해 {1,2}의 숫자를 변경함으로써 놀 수 있습니다
— Ijaz Ahmad Khan

"\b([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9][0-9]?"CIDR을 찾는 데 사용할 수도 있습니다 (유효하다고 가정)
— vikas027

2

이 답변을 기반으로 내 답변을 시작하십시오.

예, 사용할 수있는 옵션 / 도구가 많이 있습니다. 방금 이것을 시도했지만 작동합니다.

ifconfig | grep -oE "\ b ([0-9] {1,3}.) {3} [0-9] {1,3} \ b"a grep -oE "\ b ([0- 9] {1,3}.) {3} [0-9] {1,3} \ b "출력에서 IP 주소를 grep하십시오.

대답을 전체 길이 IPv6 등으로 변환하는 중 ...

fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}\b" -- file

/ nnn이 있으면 / nnn을 유지하려는 경우 :

fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}(/[0-9]{1,3}){0,1}\b" -- file

또한 '::'을 포함하는 단축 버전의 IPv6이 있습니다.

더 많은 IPv6 답변을 보려면 여기를 참조 하십시오 : /programming/53497/regular-expression-that-matches-valid-ipv6-addresses


fgrepgrep패턴 일치를 무시 하는 변형의 이전 이름입니다 . 특히 패턴 일치를 명확하게 원할 때 grep(또는 egrep) 를 사용하는 것이 좋습니다 .
— roaima

2

예 ips를 들어 파일이 호출되면 다음과 같이 작성할 수 있습니다.

while read -r ip
    do
        if [[ $ip == "$1" ]]; then
            shift
            printf '%s\n' 'action to take if match found'
        else
            printf '%s\n' 'action to take if match not found'
        fi
    done < ips

그런 다음 스크립트를 따라 매개 변수를 전달할 수 있습니다

./myscript 159.143.23.12 134.12.178.131 124.143.12.132 124.143.12.132

1

SmartOS (Solaris의 변형) 에서 테스트 되었으므로 다른 * nix 환경에서 작동해야합니다.

egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])'

예:

$ cat >file.txt
IP1: 192.168.1.1
IP2: 261.480.201.311
IP3: 1012.680.921.3411

$ egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt
IP1: 192.168.1.1

이 패턴은 일치하는 유효한 즉 IPv4를, 255에 이르기까지 다양합니다. 일치하는 IP 만 추출해야하는 경우 위 명령에 옵션을 추가하십시오 . 이 명령을 bash 스크립트와 다른 셸 스크립트에 포함시킬 수 있습니다. 그리고 실패하면x.x.x.xx-oegreptry grep -E ...

(bash) 쉘 스크립트에서 사용하기 :

ip=$(egrep -o '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt) echo $ip


이것은 CentOS 6 시스템, grep 2.6.3에서 잘 작동했습니다
— David Ramirez

0

파일에 IP 목록이있는 경우 한 줄에 하나씩 grep이미 편리한 -f옵션이 있습니다.

$ man fgrep | grep file= -A1
       -f FILE, --file=FILE
              Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.  (-f is specified by POSIX.)

이로 인해 선택적으로 다른 숫자가 오는 문자열로 인해 약간의 오탐 (false positive)이 발생하여 다른 IP로 만들 수 있습니다. 귀하의 경우에 따라 걱정하거나 결정하지 않을 수있는 많은 일을 할 수 있습니다.


0

다른 게시물에 대한 나의 대답이 여기에 더 적합하다고 생각합니다. 이 게시물과 다른 게시물 덕분에 올바른 IP 형식을 찾은 다음 256 이상이 포함 된 모든 줄을 제거했습니다. 대신 출력이 표시되지 않는 IP를 유효하지 않은 것으로 바꾸십시오.

echo '255.154.12.231' | grep -E '(([0-9]{1,3})\.){3}([0-9]{1,3}){1}' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]'

첫 번째 grep이이 게시물에있을 수 있으며 XXXX 형식의 0-999 범위의 숫자를 확인합니다.

두 번째 grep은 256-999의 숫자로 된 행을 제거하므로 유효한 형식 IP 만 남습니다.

그러나 G-Man이 지적한 것처럼 IP가 자체 회선에 있다고 가정하면 오류가 발생했습니다. 그러나 대부분의 경우 IP의 양쪽에서 찾을 공간이나 다른 분배기가 있습니다. IP를 찾은 후 sed 또는 다른 방법으로 공백 / 분배기를 제거 할 수 있습니다. 또한 첫 번째 grep에 -o를 추가했습니다.

echo ' 1234.5.5.4321 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'

echo ' 234.5.5.432 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'
echo ' 234.5.5.100 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'

첫 번째와 두 번째는 출력을 제공하지 않지만 세 번째는 공백을 제거합니다.


10.0.0.1에서 10.0.1.244 범위의 500 개의 주소가 있다고 가정합니다. 당신의 두 번째 grep는“500”때문에 그 라인을 버릴 것입니다. (질문은 파일의 IP 주소가 있다면 그 자체로 줄에있을 것이라고 결코 말하지 않았습니다.) 반면에 1234.1.1.1 및 1.1.1.1234를 허용합니다. 그러나 그 외에는 나쁘지 않습니다.
— G-Man, 'Reinstate

-1

해당 출력을 일부로 리디렉션 outputFile

간단히 grep패턴으로

grep -sE "159.143.23.12|134.12.178.131|124.143.12.132" <outputFile>

4
주 .말 그대로 정규 표현식 연산자이며이 취급하는 탈출해야합니다
— 스테판 Chazelas가

1
그것들은 패턴이 아니며 리터럴입니다. OP가 "any IP"를 지정했기 때문에 유용한 답변이 아닙니다.
— 마크 허드슨

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.