【问题标题】:Porting cshell code to bourne shell将 cshell 代码移植到 bourne shell
【发布时间】:2013-12-12 19:20:33
【问题描述】:
cat /tmp/SYSLOG | tee >( egrep -i "session limit" > sess.txt) | egrep "dst_port=3389 " > dst.txt

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

【问题讨论】:

  • 你得到什么错误?
  • 你确定那是C shell吗? tcsh 手册无法识别 >( ... ) 符号 AFAICS。这是一个bash 符号。

标签: shell unix


【解决方案1】:

这看起来像 Process substitution 中的 bash。

如果您正在寻找真正的 Bourne shell(而不是 bash),那么您将不得不进行模拟工作。事实上,最好的办法是获得一个显式运行其他程序的程序(pee 就是这样;ISTR 还有其他的——参见Is it possible to distribute stdin over parallel processes?,其中提到了 GNU parallel)。

如果您也不能这样做,那么您将不得不重新访问代码。最简单的修复方法如下:

egrep -i "session limit"  /tmp/SYSLOG > sess.txt &
egrep    "dst_port=3389 " /tmp/SYSLOG > dst.txt  &
wait

这将并行运行命令。第二个& 是不必要的,但为了对称而存在。事实上,这可以在任何 shell 中工作,因此它是可移植的解决方案。除非cat /tmp/SYSLOG 操作实际上是一个复杂的程序,否则它至少与原始代码一样简洁。

【讨论】:

    【解决方案2】:

    Bourne 不进行进程替换,即>(...)。改用 bash。

    【讨论】:

      【解决方案3】:

      您可以在您的 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
      

      【讨论】:

        猜你喜欢
        • 2015-08-20
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-14
        • 2011-04-29
        • 2015-07-15
        • 2011-01-15
        相关资源
        最近更新 更多