我的脚本接受 stdin 上的流。无论如何,我都想将第一行传递给标准输出,并用 grep 剩余的行-v并将它们传递给标准输出。
我使用 tee 制定了一个解决方案,但我想知道这是否保证总是head在grep? 如果head在打印任何内容之前替换为阻塞 20 分钟的内容,该输出是否会出现在输出之后的 stdout 末尾grep?
tee >(head -n 1) >(tail -n +2 | grep -v -E "$PATTERN")
Run Code Online (Sandbox Code Playgroud)
如果无法保证订单,那么正确的做法是什么?
你想多了,你不需要tee,head或tail。
您可以使用第一行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)