我有一个场景,我需要过滤日志文件。为此,我想要跟踪日志文件的最后 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