`uniq` 在管道传输时不是实时的

dan*_*bst 3 pipe uniq

当我跑

for i in {1..2000}; do sleep 0.1 && echo $(netstat -s | grep -i syns); done | uniq
Run Code Online (Sandbox Code Playgroud)

当表情$(netstat -s | grep -i syns)发生变化时,我可以实时看到。

但是当我想修改管道的输出时:

for i in {1..2000}; do sleep 0.1 && echo $(netstat -s | grep -i syns); done | uniq | while read line; do echo $(date) $line; done
Run Code Online (Sandbox Code Playgroud)

实时行为丢失。如何使用 的输出uniq进行进一步操作,特别是将日期附加到每个输入行更改?

Pet*_*ter 5

也许你只需要改变缓冲:

# buffering totally off
stdbuf -i0 -o0 -e0 command

# buffering per line only
stdbuf -oL -eL command
Run Code Online (Sandbox Code Playgroud)

它在这里对我有用......你的结果可能会有所不同。如果它不起作用,请尝试将它放在不同的命令之前(而不是 while 或 read,因为它们是 bash 内置命令)。

for i in {1..2000}; do
    sleep 0.1 && echo $(netstat -s | grep -i syns)
done \
| stdbuf -oL -eL uniq | while read line; do
    echo $(date) $line
done
Run Code Online (Sandbox Code Playgroud)