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

标签 linux bash shell pipe cat

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

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

随着我越来越熟练地使用这些命令,我​​发现自己越来越多地使用它们。我以前使用 notepad++ regex-search&replace 做的事情,现在我知道如何在我的 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

这可行,但有点麻烦。

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

最佳答案

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

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

关于linux - 如何让 linux 命令在管道传输之前等待输入结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23704927/

相关文章:

c - 为什么在内核编程中使用 u8 u16 u32 u64 而不是 unsigned int

linux - 使用 printf 打印 ascii 字符,但 printf 不会打印八进制 100+ 的任何内容

regex - sed 命令 - 从 spec 文件中获取值并将其分配给 sh 文件中的变量

linux - 删除 `~` 中的 `~/my_repo/~`

linux - 如何在 OSX 或 LINUX 上执行没有完整目录的 execv()?

java - jstack 的输出缺少 tid 和 nid 信息

linux - 登录安全服务器后自动执行 HTTP 请求

linux - Bash 将带引号的行拆分为参数

regex - bash 中的 for 循环遍历具有两个特定扩展名的文件

linux - Bash 无法更改文件内容