Trong bài viết này, mình sẽ hướng dẫn các bạn cách lọc địa chỉ IP trong file text trên Linux. Cực kì đơn giản với chương trình lệnh dùng để lọc thông tin text, đó chính là ‘grep‘. Các bạn lưu ý là sẽ có một số biểu thức (regular expression) mà các bạn cần nhớ khi sử dụng với ‘grep‘.
Giờ giả sử ta có nội dung file text như sau:
# cat demo.txt This is normal IP : 192.168.100.15 This is invalid IP : 267.253.23.124 Another invalid IP : 666.777.888.999
1. Lọc khớp 4 dãy Octer IP
Với biểu thức sau sẽ match thông tin cả 4 dãy Octet IP từ “0.0.0.0” -> “999.999.999.999” .
"([0-9]{1,3}[\.]){3}[0-9]{1,3}"
Ví dụ:
# grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" demo.txt 192.168.100.15 267.253.23.124 666.777.888.999
Chú thích: option của chương trình lệnh “grep”
- -E, –extended-regexp : sử dụng biểu thức mở rộng.
- -o, –only-matching : chỉ hiển thị dữ liệu lọc được.
Nhưng mà như vậy thì chưa đúng phải không nào ? Vì 1 Octet IP không thể nào lớn hơn con số 255 được.
2. Chỉ lọc địa chỉ IP v4 khi khớp
Hãy sử dụng biểu thức ở dưới đây, sẽ đảm bảo lọc khớp đúng với thông tin IP Address v4. Nhưng ta sẽ sử dụng tool ‘egrep’, nâng cao khác của grep nhé.
\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
Ví dụ:
# egrep -o "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" demo.txt 192.168.100.15
Các bạn có thể làm biến biểu thức, nếu nó quá dài nhìn khá bất tiện trong quá trình viết shell script chẳng hạn.
# regex="\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" # egrep -o $regex demo.txt
Vậy là các bạn biết cách để lọc địa chỉ IP trong 1 file text rồi nhé.