我有一个文件,其中包含以下内容:
2) Wiegley Maths 90
3) Artur Biology 87
4) Drew English 85
5) Phils History 89
我将其存储在名为marks.txt
的文件中。
在shell中,我使用sed
和awk
(使用xfce4终端模拟器)运行了一些操作
awk '{print $3 "\t" $4}' marks.txt | sed -e '/^E/d' > foo.txt | cat foo.txt
当我快速执行相同的命令(向上箭头并输入)时,它有时会为我提供文件foo.txt
的输出。但有时候,当快速重复相同的命令时,它不会给我输出。
我无法理解这一点,它看起来像是一个随机行为,来自我的shell。当我快速重复相同的命令时,有人可以解释为什么cat
有时会提供输出吗?是不是会先等待awk
和sed
的输出?
答案 0 :(得分:2)
cat
的管道没有意义,因为您没有在其中传递任何数据,或尝试使用它(为此,您将使用cat -
)。
您的命令会打开三个子shell。中间的>
将在等待任何输入之前截断文件foo.txt
。 cat foo.txt
会在或多或少的同时尝试访问foo.txt
文件。根据首先发生的这两件事中的哪一件,foo.txt
将包含上次运行命令时的内容,或者它将为空。
对于记录,您的命令最好写成:
awk -v OFS='\t' '$3 !~ /^E/ { print $3, $4 }' marks.txt > foo.txt
如果您想将结果打印到标准输出并同时写入文件,一个选项是使用tee
。
awk -v OFS='\t' '$3 !~ /^E/ { print $3, $4 }' marks.txt | tee foo.txt
这将打印第三个字段不以E
开头的任何行的第三个和第四个字段。
答案 1 :(得分:1)
您的问题似乎与管道和重定向之间的优先级有关。
在之前完成将命令行拆分为管道命令 文件重定向。文件重定向发生在第二个,如果存在, 优先于管道重定向。 (文件重定向始终 胜。)
来自:http://www.cs.colostate.edu/~mcrob/toolbox/unix/redirection
你可以在这里找到一些例子: