通过tee将文件通过tail和head进行管道处理

3

这里开始,我尝试读取一个文件并输出该文件的头部和尾部(只读取一次文件)。

我尝试了以下方法: tee >(head) >(tail) > /dev/null < text.txt

这行代码按预期工作,但我想要摆脱/dev/null。所以我尝试了: tee >(head) | tail < text.txt

但是这行代码不像我期望的那样工作,它打印出头部但之后没有返回。显然tail在等待某些东西,但我不知道具体是什么。 我发现了这个Stack Overflow问题,但我无法通过提供的答案来解决问题。

1个回答

5
tee >(head) | tail < text.txt 命令中,文本文件直接传送给了 tail 命令。你可能的意思是:
tee >(head) < text.txt | tail

这个命令不需要等待任何结果,但也不会真正执行,因为tee和head的输出都会传递给tail。

将head的输出重定向到一个新的文件描述符,然后再重新获取它可以解决问题,但我不确定这是否比使用/dev/null更“干净”:

( tee >(head >&3) < text.txt | tail) 3>&1 

@chepner,您误解了。请将 echo -e "a\nb\nc" | tee >(head -1) | tail -1 的结果与 echo -e "a\nb\nc" | tee >(head -2) | tail -1 的结果进行比较。 - Ansgar Wiechers
1
我错了。我一直在使用zsh进行测试,这引发了一些(与主题无关的)问题 :) - chepner
哇,我从来没有想过这个。但它有效!非常感谢! - Bouncner
1
天啊,不行啊。为了查看shell的并发性,我创建了一个有100万行(75MB)的文件。现在命令不再按预期工作了(tail只能输出约15k行)。是管道关闭得太早了吗?有什么想法吗? - Bouncner
1
请查看 https://dev59.com/3XLYa4cB1Zd3GeqPWll0 进行后续跟进。 - choroba
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接