两个“tail -f”命令的并排输出

两个“tail -f”命令的并排输出

我有两个脚本定期发出单个字符串来记录文件,我需要tail -f并排组合我正在使用的paste.这是可行的,但我无法将输出通过管道传输到另一个tail -f,以便我可以获得并排粘贴的两个字符串的连续输出。

为了说明/重现问题,我有以下脚本:

p1.sh:

#!/bin/bash

i=0
while true
do
  i=$((i+1))
  sleep 4
  echo "P1string$i" >> out1.log
done

p2.sh:

#!/bin/bash

i=0
while true
do
  i=$((i+1))
  sleep 4
  echo "P2string$i" >> out2.log
done

我在后台运行它们,如下所示:

$ ./p1.sh &
$ ./p2.sh &

现在,这有效:

paste <(tail -f out1.log) <(tail -f out2.log)

但这不起作用:

paste <(tail -f out1.log) <(tail -f out2.log) | tail -f

原则上,这只是管道标准输出tail -f并且应该可以工作!不?

答案1

要回答你的问题“原则上,这只是通过管道将 stdout 传输到 tail -f 并且应该可以工作!不?”,答案确实是“不”。

tail命令旨在给出文件或标准输入的最后 10 行输出。在管道上使用时,它将等待管道关闭,然后打印出它缓冲的最后 10 行。在您的示例中,管道永远不会关闭,因此 tail 永远不会打印出任何内容。

证明这一点的一个简单测试是while true; do echo "Hello"; done | tail -f,它也永远不会打印任何内容。

答案2

您是否希望将它们并排放置...尝试一下

paste file1.txt file2.txt > merged.txt

或者如果你想将它们分隔开

paste -d ',' file1.txt file2.txt > merged.txt

相关内容