在 bash 脚本中多次使用 stdin

Rob*_*ell 5 bash tee

我的脚本接受 stdin 上的流。无论如何,我都想将第一行传递给标准输出,并用 grep 剩余的行-v并将它们传递给标准输出。

我使用 tee 制定了一个解决方案,但我想知道这是否保证总是headgrep? 如果head在打印任何内容之前替换为阻塞 20 分钟的内容,该输出是否会出现在输出之后的 stdout 末尾grep

tee >(head -n 1) >(tail -n +2 | grep -v -E "$PATTERN")
Run Code Online (Sandbox Code Playgroud)

如果无法保证订单,那么正确的做法是什么?

Adr*_*rth 5

你想多了,你不需要tee,headtail

您可以使用第一行read并打印出来,然后grep在其余部分使用:

$ printf "foo\nbar\nquux\n" | { read v; echo "$v"; grep -v bar; }
foo
quux
Run Code Online (Sandbox Code Playgroud)

或者,将逻辑组合成单个awk语句并完全避免问题:

$ printf "foo\nbar\nquux\n" | awk 'NR==1{print;next} !/bar/'
foo
quux
Run Code Online (Sandbox Code Playgroud)