将cshell代码移植到bourne shell

时间:2013-12-12 19:20:34

标签: shell unix

cat /tmp/SYSLOG | tee >( egrep -i "session limit" > sess.txt) | egrep "dst_port=3389 " > dst.txt

适用于C-shell但不适用于Bourne。我从括号中逃脱了它不再抱怨但它不起作用。帮助!

3 个答案:

答案 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