O seguinte é um regex adequado, dividido em 4 linhas diferentes para minha própria sanidade.
(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.
(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.
(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.
(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])
Saída:
egrep -o 'cat regex' infile #all regex lines above joined, no spaces
1.1.1.1
1.1.1.133
31.1.1.1
5.5.5.5
1.1.1.134
192.9.30.174
5.5.5.5
5.5.5.5
5.5.5.5
22.22.22.22
172.78.0.1
5.4.3.27
Obviamente, isso não corresponde ao seu exemplo. Por quê? Porque não podemos dizer que um 3 não pertence a um. Como você pode ver, os números de lixo não podem ser facilmente adivinhados.