쉘 스크립팅을 사용하여 파일에 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.