我的脚本接受stdin上的流。我想将第一行传递给stdout,无论如何,并使用-v
grep剩余的行,并将这些行传递给stdout。
我使用tee制定了一个解决方案,但我想知道是否可以保证在head
的输出之前始终打印grep
的输出?如果在打印任何内容之前将head
替换为阻塞了20分钟的内容,该输出会在grep
的输出之后出现在stdout的末尾会怎样?
tee >(head -n 1) >(tail -n +2 | grep -v -E "$PATTERN")
如果订单无法保证,这样做的正确方法是什么?
答案 0 :(得分:4)
你正在思考这个问题而你不需要tee
,head
或tail
。
您可以使用read
消费第一行,然后将其打印出来,然后在其余部分使用grep
:
$ printf "foo\nbar\nquux\n" | { read v; echo "$v"; grep -v bar; }
foo
quux
或者,将逻辑组合成单个awk
语句并完全避免问题:
$ printf "foo\nbar\nquux\n" | awk 'NR==1{print;next} !/bar/'
foo
quux
答案 1 :(得分:1)
你是偏执狂的权利。两个子壳将并行运行,因此不能保证一个子壳将在另一个子壳之前运行。要强制执行操作顺序,请在grep其余输入之前读取并打印第一行。
read line && printf '%s\n' "$line"
tee >(grep -v -E "$PATTERN")
答案 2 :(得分:1)
我想我会选择sed
:
printf "Line1\nfoo\nbar\n" | sed '1n;/bar/d'
<强>输出:强>
Line1
foo
那说......如果是第1行打印并转到下一行,否则如果该行包含bar
,则将其删除。