如何在管道输入之前使linux命令等待输入结束?

时间:2014-05-16 21:36:14

标签: linux bash shell pipe cat

我发现自己经常使用linux shell命令,例如grepsedawk来格式化/过滤/转发更有用的东西。

“源”数据通常是进程的输出,或本地文件的cat

随着命令越来越流畅,我发现自己越来越多地使用它们了。我以前用记事本++正则表达式搜索和替换之前做的事情,我现在知道如何在我的shell中“动态”做。

我现在遇到的“问题”是如何处理我从另一个源“复制”的数据,我希望通过stdin直接将其提供给shell,输出我只想在stdout中看到。我遇到的问题是输入和输出存在“十字交叉”。例如:

>awk '$1 == "true" {print $2}'
true Paul
Paul
false John        
true Janice
Janice

问题是这对我来说无法使用。我需要输出明确地与输入分开。要么它之后,或者我根本不想看到stdin。

我们怎么能这样做?我发现我可以使用tail来“保留”输入数据,直到全部被输入:

tail -n 999 | awk '$1 == "true" {print $2}'
true Paul
false John
true Janice
Paul
Janice

这有效,但有点麻烦。

是否有任何内置命令基本上“保持”流直到它结束(或者更确切地说,在处理完所有输入之前不打印任何内容)?或者简单地抑制看到stdin的方法?我也可以使用临时文件,但我希望有一个“干净的一步没有开销”的方式...

2 个答案:

答案 0 :(得分:4)

awk '$1 == "true" {print $2}' | tac | tac

awk '$1 == "true" {print $2}' > /tmp/file.txt; cat /tmp/file.txt

答案 1 :(得分:2)

我不知道任何此类命令,但您可以轻松地在.bashrc中添加自己的命令:

waiting() {
  printf "%s\n" "$(cat)"
}

然后

awk '$1 == "true" {print $2}' | waiting

如果您愿意,您当然也可以先放waiting