cat /tmp/SYSLOG | tee >( egrep -i "session limit" > sess.txt) | egrep "dst_port=3389 " > dst.txt
适用于C-shell但不适用于Bourne。我从括号中逃脱了它不再抱怨但它不起作用。帮助!
答案 0 :(得分:2)
在bash
中看起来像Process substitution。
如果您正在寻找真正的Bourne shell(而不是bash
),那么您的工作将会模拟出来。事实上,你最好的选择是获得一个明确运行其他程序的程序(pee
就是这样; ISTR还有其他程序 - 请参阅Is it possible to distribute stdin over parallel processes?提到GNU parallel
。< / p>
如果你不能这样做,那么你将不得不重新访问代码。最简单的修复方式如下:
egrep -i "session limit" /tmp/SYSLOG > sess.txt &
egrep "dst_port=3389 " /tmp/SYSLOG > dst.txt &
wait
这会并行运行命令。第二个&
是不必要的,但存在对称性。实际上,这适用于任何shell,因此它是便携式解决方案。除非cat /tmp/SYSLOG
操作实际上是一个复杂的程序,否则它至少与原始代码一样整洁。
答案 1 :(得分:0)
Bourne不会进行流程替换,即>(...)
。改为使用bash。
答案 2 :(得分:0)
你可以在你的bourne shell脚本中调用awk:
awk '
tolower($0) ~ /session limit/ {print > "sess.txt"}
/dst_port=3389 / {print > "dst.txt"}
' /tmp/SYSLOG
如果你碰巧有GNU awk:
gawk -v IGNORECASE=1 '
/session limit/ {print > "sess.txt"}
/dst_port=3389 / {print > "dst.txt"}
' /tmp/SYSLOG