bash script não lê o último arquivo canalizado

0
for i in {1..255} ; do host 10.1.9.$i ; done |grep not|awk '{print $2}' | awk -F. '{print $1}'> /tmp/filx   | for i in 'cat /tmp/filx' ; do echo $i ; done

Não tenho certeza porque oo / p não está aparecendo, o arquivo tem valores de ips não usados, obrigado

    
por Kiran Kumar 13.08.2017 / 08:22

2 respostas

0

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
    
por 13.08.2017 / 09:24
1

Porque você é redirecionado para um arquivo apenas. Se você quiser passar para o próximo comando, use tee para fazer as duas coisas.

...  | tee /tmp/filx |... 

O tee é usado para gravar no arquivo e passar o stdout para o próximo comando via | para ler stdin.

Ou você deve alterar essa parte do comando /tmp/filx | , o | to ; ou && .

    
por 13.08.2017 / 08:26

Tags