Você pode reduzir o segundo grep
um pouco assim:
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'
Para responder a sua primeira pergunta, as aspas duplas permitem que o shell faça várias coisas, como expansão de variáveis, mas proteja alguns metacaracteres da necessidade de serem escapados. As aspas simples impedem que o shell faça essas expansões. Não usar citações deixa as coisas abertas.
$ empty=""
$ text1="some words"
$ grep $empty some_file
(It seems to hang, but it's just waiting for input since it thinks "some_file" is
the pattern and no filename was entered, so it thinks input is supposed to come
from standard input. Press Ctrl-d to end it.)
$ grep "$empty" some_file
(The whole file is shown since a null pattern matches everything.)
$ grep $text1 some_file
grep: words: No such file or directory
some_file:something
some_file:some words
(It sees the contents of the variable as two words, the first is seen as the
pattern, the second as one file and the filename as a second file.)
$ grep "$text1" some_file
some_file:some words
(Expected results.)
$ grep '$text1' some_file
(No results. The variable isn't expanded and the file doesn't contain a
string that consists of literally those characters (a dollar sign followed
by "text1"))
Você pode aprender mais na seção "QUOTING" de man bash