BASH 中的嵌套重定向

BASH 中的嵌套重定向

我有一个场景,我需要过滤日志文件。为此,我想要跟踪日志文件的最后 10 行左右,并在读入新行时,通过 awk 程序将它们传输,然后通过 netcat 将输出重定向到远程主机上的监听端口。

目前我的脚本中有以下行:

echo "\`awk -f rules.awk <(tail -F $@)\`" | nc -u 127.0.0.1 5004

$@初始调用中提供的参数列表在哪里,并且 rules.awk 仅包含一些需要匹配的模式。

调用脚本./script logfile.log似乎没有任何作用,并且脚本挂起。我推测管道实际上需要一个进程终止,然后其最终输出才会真正通过管道传输到新命令。

因此我尝试了一种不同的方法,在我的终端中运行以下命令:

nc -u 127.0.0.1 5004 <(awk -f rules.awk <(tail -F logfile.log))

这导致了以下错误:

Invalid port specification: /dev/fd/63

看起来重定向实际上传递了流的逻辑设备而不是它的“值”,但我只是再次猜测。

有更多 BASH 知识的人可以为我指明正确的方向吗?

答案1

文件描述符有点令人困惑,它们肯定比管道更令人困惑。因此,在尝试重定向子 shell 的输出之前 (<()) 作为命令的标准输入,尝试使用管道获取所需内容。此外,在将输入发送到目标命令 (nc) 之前,让输出命令正常工作可能会有所帮助。

cat <(tail -F /var/log/daemon.log ) | cat -n | awk 'NR>3 { print}'

这相当于

tail -F /var/log/daemon.log | cat -n | awk 'NR>3 {print}';

但“更好”,因为它不依赖于 bash 特定的语法 `<()'

答案2

在我看来这应该可行

tail -F $@ | awk -f rules.awk | nc -u 127.0.0.1 5004

相关内容