Quase nunca há um bom motivo para canalizar grep para awk . awk pode fazer correspondência de padrões sozinho - tente awk '/not/ {print $2}' .
E o piping awk em outro awk também é desnecessário. Aqui você só precisa fornecer um conjunto de separadores de campo (espaço e . ) em vez do espaço em branco padrão como separador:
awk -F'[ .]' '/not/ {print $2}'
Um loop for em torno de cat apenas para echo o conteúdo de cada linha é sem sentido. Na verdade, é pior que inútil - é lento, ineficiente e submete cada linha à divisão de palavras padrão do shell (não é um problema com essa entrada específica, mas potencialmente um problema se você achar que essa é uma boa técnica e usá-la em arquivos de entrada pode conter espaços etc). Apenas use cat .
Mas você nem precisa usar cat aqui. tee copia stdin para um arquivo e para stdout - isto é, é como uma versão sofisticada de cat que também copia sua entrada para um arquivo.
Usando tee como mencionado por @AFSHIN, todo o seu one-liner pode ser reduzido para:
for i in {1..255} ; do "host 10.1.9.$i" ; done |
awk -F'[ .]' '/not/ {print $2}' |
tee /tmp/flix