我发现自己经常使用linux shell命令,例如grep
,sed
和awk
来格式化/过滤/转发更有用的东西。
“源”数据通常是进程的输出,或本地文件的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的方法?我也可以使用临时文件,但我希望有一个“干净的一步没有开销”的方式...
答案 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
。