在bash脚本中多次使用stdin

时间:2014-03-25 21:31:56

标签: bash tee

我的脚本接受stdin上的流。我想将第一行传递给stdout,无论如何,并使用-v grep剩余的行,并将这些行传递给stdout。

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

tee >(head -n 1) >(tail -n +2 | grep -v -E "$PATTERN")

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

3 个答案:

答案 0 :(得分:4)

你正在思考这个问题而你不需要teeheadtail

您可以使用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,则将其删除。