Я сомневаюсь, что это можно сделать с помощью регулярного выражения POSIX, поэтому я бы предпочел предложить решение PCRE:
grep -P '(?<!\d\.|\d)\d{1,3}(?:\.\d{1,3}){3}(?!\.?\d)' filename
Шаблон соответствует
(?<!\d\.|\d)
- местоположение, которому непосредственно не предшествует цифра и точка или просто цифра
\d{1,3}
- от 1 до 3 цифр
(?:\.\d{1,3}){3}
- три случая
\.
- точка
\d{1,3}
- от 1 до 3 цифр
(?!\.?\d)
- местоположение, за которым не сразу следует дополнительная точка, а затем цифра.
Чтобы сделать шаблон немного более точным, замените шаблон октетов (\d{1,3}
) на (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
.