Eu tenho um cenário onde eu quero filtrar arquivos de log. Para fazer isso eu estou querendo seguir as últimas 10 linhas ou mais de um arquivo de log e como novas linhas são lidas, canalizá-las através de um programa awk e redirecionar a saída para uma porta de escuta em um host remoto via netcat.
Atualmente meu script tem a seguinte linha:
echo "\`awk -f rules.awk <(tail -F $@)\`" | nc -u 127.0.0.1 5004
Onde $@
é a lista de argumentos fornecida na chamada inicial e o rules.awk simplesmente contém alguns padrões desejados para combinar.
Chamando o script com ./script logfile.log
parece não fazer nada e o script trava. Eu especulo que o pipe realmente requer que um processo termine antes que sua saída final seja canalizada para o novo comando.
Então eu tentei uma abordagem diferente executando o seguinte no meu terminal:
nc -u 127.0.0.1 5004 <(awk -f rules.awk <(tail -F logfile.log))
Isso resultou no seguinte erro:
Invalid port specification: /dev/fd/63
Parece que o redirecionamento realmente passou o dispositivo lógico do fluxo em vez de seu "valor", mas estou apenas adivinhando novamente.
Poderia alguém com um pouco mais de BASH me apontar na direção certa com isso?
fonte
Respostas:
Os descritores de arquivos são um pouco confusos, eles são certamente mais confusos do que os pipes. Então, antes de tentar redirecionar a saída de um subshell ( & lt; () ) como entrada padrão para um comando, tente obter o que você deseja com pipes. Além disso, pode ajudar a obter os comandos de saída funcionando corretamente antes de enviar a entrada para um comando de destino (nc).
isso é equivalente a
mas "melhor", uma vez que não se baseia na sintaxe específica do bash `& lt; () '
fonte
De improviso, isso parece que deveria funcionar para mim
fonte