如何重写程序的终端输出

时间:2013-02-14 08:43:46

标签: sed terminal output

我正在从终端运行一个应用程序(CoronaSDK Simulator),它在每一行输出前放置了一个非常长的时间戳。

有没有办法使用像sed这样的东西来切断它,而是在输入时输出其他所有内容(即无需等到程序结束)?

我尝试了几件事,但到目前为止没有运气......

以下是一些示例行:

2013-02-14 12:39:49.028 Corona Simulator[40803:707] |timer created
2013-02-14 12:39:49.029 Corona Simulator[40803:707] __in deck.lua__
2013-02-14 12:39:49.030 Corona Simulator[40803:707] storyboard.roomData.layout=A1 (room.lua)

我希望看起来像这样:

|timer created
__in deck.lua__
storyboard.roomData.layout=A1 (room.lua)

我试过了

coronasim ./ | sed 's/Corona Simulator//'

作为测试,

coronasim ./ | sed -e 's/^.* //'

如下所示,甚至

coronasim ./ > /dev/null

但似乎没有任何改变输出。

解决方案是:

coronasim ./ 2>&1 | sed -e 's/^.*] //'

根据choroba的建议如下。似乎Corona SDK模拟器将输出发送到stderr而不是stdout。

对于其他感兴趣的人,创建了一个简单的bash脚本,在模拟器中运行当前导演中的程序,删除时间戳:

/Applications/CoronaSDK/Corona\ Simulator.app/Contents/MacOS/Corona\ Simulat
or ./ 2>&1 | sed -e 's/^.*] //'

1 个答案:

答案 0 :(得分:1)

是的,sed作为流编辑器应该是正确的工作工具。只需将应用程序的输出重定向到它:

myapp | sed -e 's/^.* //'

但您可能会遇到问题:

  1. 如果应用程序写入标准错误rahter而不是标准输出,则必须使用

    重定向流

    myapp 2>& 1 | sed -e ...

  2. 如果应用程序未连接到终端,应用程序可能会缓冲其输出。除非有特定的选项来改变行为,否则在这种情况下你运气不好。

相关问题