Làm cách nào để kiểm tra xem có địa chỉ IP nào hiện diện trong một tệp bằng cách sử dụng shell script không?


13

Tôi có một kịch bản tạo ra một số đầu ra. Tôi muốn kiểm tra đầu ra cho bất kỳ địa chỉ IP nào như

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 //

fgrepmột ý tưởng tốt?

Tôi có sẵn bash.


sử dụng grep, egrep, awk hoặc sed, bất cứ điều gì bạn thích
Ijaz Ahmad Khan

Bạn có thể giúp với cú pháp xin vui lòng? Ý tôi là làm thế nào để nó tìm kiếm một IP ngẫu nhiên. Làm thế nào để mô tả các mô hình? Tôi sẽ tìm kiếm bất kỳ địa chỉ IP, không phải là một địa chỉ cụ thể.
Koshur

5
Có phải đó chỉ là địa chỉ IPv4 trong ký hiệu thập phân? Họ có thể được viết như thế 0010.0000.0000.0001nào? Tập tin có thể chứa những thứ trông giống địa chỉ IP như số phiên bản ( soft-1.2.1100.1.tar.gz, thông số mạng (10.0.0.0/24), 1.2.3.4.5) không? Bạn có chấp nhận một giải pháp tích cực trên 333.444.555.666 không? Hoặc 0377.0377.0377.0377(một địa chỉ IP tứ giác hợp lệ)?
Stéphane Chazelas

Nếu bashcó sẵn, thì awkthường cũng vậy, vì vậy điều này có thể phù hợp với bạn: awk '/([0-9]{2,3}\.){3}/ {print $5 "\t" $1}'(Điều này một lớp sẽ dịch đầu ra của danh sách XFR của máy chủ thành /etc/hostsđịnh dạng.)
Mark Hudson

Câu trả lời:


25

Có, bạn có rất nhiều tùy chọn / công cụ để sử dụng. Tôi vừa thử cái này, nó hoạt động:

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

vì vậy bạn có thể sử dụng grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"để grep các địa chỉ IP từ đầu ra của bạn.


Cảm ơn. Những công việc này. Bạn có thể giải thích một chút? Đây có phải là một biểu thức thường xuyên?
Koshur

Có, đây là biểu thức chính quy được sử dụng trong bash với grep, bạn chỉ tìm kiếm mẫu ba chữ số cách nhau bằng dấu chấm. bạn có thể chơi bằng cách thay đổi các số trong {1,2} cho 2 chữ số liên tiếp, v.v.
Ijaz Ahmad Khan

Người ta cũng có thể sử dụng "\b([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9][0-9]?"để tìm CIDR (giả sử chúng hợp lệ)
vikas027

2

bắt đầu câu trả lời của tôi dựa trên câu trả lời này:

Có, bạn có rất nhiều tùy chọn / công cụ để sử dụng. Tôi vừa thử cái này, nó hoạt động:

ifconfig | grep -oE "\ b ([0-9] {1,3}.) {3} [0-9] {1,3} \ b" a để bạn có thể sử dụng grep -oE "\ b ([0- 9] {1,3}.) {3} [0-9] {1,3} \ b "để grep các địa chỉ IP từ đầu ra của bạn.

và chuyển đổi câu trả lời sang IPv6 độ dài đầy đủ, v.v ...:

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

nếu bạn muốn giữ / nnn nếu nó ở đó:

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

và cũng có phiên bản rút gọn của IPv6 bao gồm '::'.

để biết thêm câu trả lời IPv6, bạn có thể xem tại đây: /programming/53497/THER-expression-that-matches-valid-ipv6-addresses


fgreplà tên cũ của một biến thể grepmà bỏ qua khớp mẫu. Tôi khuyên bạn nên sử dụng grep(hoặc thậm chí egrep) thay vào đó, đặc biệt là khi bạn rõ ràng muốn khớp mẫu.
roaima

2

Nếu tệp của bạn được gọi, ví dụ: ipsbạn có thể viết đôi khi như:

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

Sau đó, bạn có thể truyền các tham số như theo kịch bản

./myscript 159.143.23.12 134.12.178.131 124.143.12.132 124.143.12.132

0

Nếu bạn có danh sách IP trong một tệp, mỗi dòng trên một dòng, grepđã có -ftùy chọn thuận tiện :

$ 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.)

Điều này có thể gây ra một vài kết quả dương tính do các chuỗi tùy ý theo sau bởi một số khác để biến nó thành một IP khác. Rất nhiều điều bạn có thể làm về nó, tùy thuộc vào trường hợp của bạn, bạn có thể hoặc không thể quyết định lo lắng.


0

Đã thử nghiệm trong SmartOS (một biến thể của Solaris), hy vọng sẽ hoạt động trong các môi trường * nix khác:

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])'

Thí dụ:

$ 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

Mẫu này chỉ khớp với IPv4 hợp lệ , nghĩa là x.x.x.xxphạm vi từ 0-255. Nếu bạn chỉ cần giải nén IP phù hợp, hãy thêm -otùy chọn vào lệnh trên. Bạn có thể nhúng lệnh này trong tập lệnh bash và có lẽ trong các tập lệnh shell khác. Và, nếu egrepthất bại,try grep -E ...

Sử dụng nó trong tập lệnh shell (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


0

Tôi nghĩ rằng câu trả lời của tôi cho một bài viết khác là phù hợp hơn ở đây. Nhờ bài đăng này và những người khác giống như vậy, tôi đã tìm ra bài viết này, tìm đúng định dạng IP, sau đó loại bỏ tất cả các dòng có chứa 256 hoặc cao hơn. Thay thế IP bằng một cái gì đó không hợp lệ để xem không có đầu ra thay thế:

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 đầu tiên có thể được tìm thấy trong bài đăng này và nó kiểm tra bất kỳ số nào từ 0-999 ở định dạng XXXX

Grep thứ hai loại bỏ các dòng có số 256-999, do đó chỉ để lại các IP định dạng hợp lệ, vì vậy tôi nghĩ

NHƯNG ... Như được chỉ ra bởi G-Man, tôi đã có lỗi khi cho rằng IP sẽ nằm trên đường dây của chính nó. Hầu hết luôn luôn, sẽ có một khoảng trắng hoặc một dải phân cách khác để tìm kiếm ở hai bên của IP. Các khoảng trắng / dải phân cách có thể được loại bỏ bằng sed hoặc các phương tiện khác sau khi tìm thấy IP. Tôi cũng đã thêm -o vào grep đầu tiên:

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/ //'

Cái đầu tiên sẽ không có đầu ra, trong khi cái thứ hai làm và khoảng trắng bị tước bỏ.


Giả sử tôi có 500 địa chỉ, từ 10.0.0.1 đến 10.0.1.244. Thứ hai của bạn grepsẽ ném ra dòng đó bởi vì 500 500. (Câu hỏi không bao giờ nói rằng (các) địa chỉ IP trong tệp, nếu có, sẽ nằm trên một dòng.) Mặt khác, nó sẽ chấp nhận 1234.1.1.1 và 1.1.1.1234. Nhưng bên cạnh đó, không tệ.
G-Man nói 'Phục hồi Monica'

-1

Chuyển hướng đầu ra đó đến một số outputFile

Đơn giản chỉ cần grepnó với mô hình như,

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

4
Lưu ý rằng đó .là một toán tử biểu thức chính quy và cần thoát cho nó để được xử lý theo nghĩa đen
Stéphane Chazelas

1
Đó không phải là những mẫu, đó là những chữ. Không phải là một câu trả lời hữu ích vì OP chỉ định "bất kỳ IP nào."
Mark Hudson

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.