2010-03-24 71 views
1

我们有一个多代理Java环境,其中不同的代理很可能会产生各种抛出stderr的异常。bash - 如何过滤java异常信息

这里是从巨大的例外抽取的样本数

**java.security.AccessControlException: access denied (java.io.FilePermission ..\tournament\Driver\HotelRoomAnalyser.class read)** 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkRead(Unknown Source) 
    at java.io.File.length(Unknown Source) 
    at emarket.client.EmarketSandbox$SandboxFileLoader.loadClassData(EmarketSandbox.java:218) 
    at emarket.client.EmarketSandbox$SandboxFileLoader.loadClass(EmarketSandbox.java:199) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
**java.security.AccessControlException: access denied (java.io.FilePermission ..\tournament\Driver\HotelRoomAnalyser.class read)** 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkRead(Unknown Source) 
    at java.io.File.length(Unknown Source) 
    at emarket.client.EmarketSandbox$SandboxFileLoader.loadClassData(EmarketSandbox.java:218) 
    at emarket.client.EmarketSandbox$SandboxFileLoader.loadClass(EmarketSandbox.java:199) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
    at MySmarterAgent.hotelRoomBookings(MySmarterAgent.java:108) 

幸好所有顶级异常由没有前导空格表示,通过为包裹**以上。

我关注的是第一线把所有的顶级异常名(由冒号分隔:)的,下面一起包含类似

at emarket.client.EmarketSandbox$SandboxFileLoader.loadClassData(EmarketSandbox.java:218) 

基本上,一些带衬垫的风格,开始用“at”并以“.java:108”结尾

因此,此信息可以转发给该易于出错的代理的所有者,并让他/她修复它。

我在〜/ .bashrc代码现在未完:

alias startmatch='java -jar "emarket.jar" ../tournament 100'; 
function geterrors() 
{ 
    startmatch 2>"$1"; 
    a=0; 
    while read line 
    do 
     if true; 
      then a=$(($a+1)); 
       echo $a; 
     fi; 
    done 
} 

什么,现在确实是所有标准错误重定向到传递的第一个参数指定的文本文件,并在此之后,解析该文本文件一行一行,如果某些条件返回true,则仅回显该行。

而我坚持在循环内做什么。

任何建议是非常赞赏,任何暗示都欢迎。

回答

2

您可以使用AWK

awk ' $1~/^\*\*/{except=$0} 
/emarket\.client/{ 
    print except 
    print 
}' logfile 

输出

$ ./shell.sh 
**java.security.AccessControlException: access denied (java.io.FilePermission ..\tournament\Driver\HotelRoomAnalyser.class read)** 
    at emarket.client.EmarketSandbox$SandboxFileLoader.loadClassData(EmarketSandbox.java:218) 
**java.security.AccessControlException: access denied (java.io.FilePermission ..\tournament\Driver\HotelRoomAnalyser.class read)** 
    at emarket.client.EmarketSandbox$SandboxFileLoader.loadClass(EmarketSandbox.java:199) 
**java.security.AccessControlException: access denied (java.io.FilePermission ..\tournament\Driver\HotelRoomAnalyser.class read)** 
    at emarket.client.EmarketSandbox$SandboxFileLoader.loadClassData(EmarketSandbox.java:218) 
**java.security.AccessControlException: access denied (java.io.FilePermission ..\tournament\Driver\HotelRoomAnalyser.class read)** 
    at emarket.client.EmarketSandbox$SandboxFileLoader.loadClass(EmarketSandbox.java:199) 

一个更准确的版本,只有当 “emarket.client” 型样将它打印

awk 'f&&g{next} 
$1~/^\*\*/{ 
    except=$0 
    f=1 
    g=0 
} 
f&&/emarket\.client/{ 
    print except 
    print 
    f=0;g=1 
}' file 
+0

@ ghostdog74:谢谢你!现在就开始工作。 – 2010-03-24 01:00:50

1

如何:

java -jar "emarket.jar" ../tournament 100 | grep '^\([^ ]\| \+at.*\.java:[0-9]\+)$\)' | grep -A 1 '^[^ ]' 

不是超级超级高效的,因为它读取的东西两次,但诶,因为它很短。查找无衬垫的线条或用线条编号填充,然后再查找无衬垫的线条并保留下一行。它在每对比赛之间放置一条' - '线,您可以通过加入| grep -v '^--$'来删除。

+0

哇!让我带上grep词典来理解你的解决方案:)非常感谢! – 2010-03-24 00:51:09

+0

@Jefromi:嗨,试图从你的解决方案中获得输出,但失败了,努力获得这个想法,再次感谢你的帮助。 – 2010-03-24 00:58:19

+0

@Michael Mao:我在你的示例输出上测试了它,它工作正常。这些标签是否可以作为领先空间粘贴? – Cascabel 2010-03-24 01:19:51