在一个Web扫描器应用程序中,我需要parsing一些脚本的输出来获取一些信息,但问题是我没有在linux shell和java输出中得到相同的输出,让我来描述它(这个例子是用whatweb完成的在我需要在工作中扫描的网站之一,但我也有这个问题,每当我有一个彩色的输出在壳):
这是我从Linux的输出(有些颜色):
http://www.ceris-ingenierie.com [200] Apache[2.2.9], Cookies[ca67a6ac78ebedd257fb0b4d64ce9388,jfcookie,jfcookie%5Blang%5D,lang], Country[EUROPEAN UNION][EU], HTTPServer[Fedora Linux][Apache/2.2.9 (Fedora)], IP[185.13.64.116], Joomla[1.5], Meta-Author[Administrator], MetaGenerator[Joomla! 1.5 - Open Source Content Management], PHP[5.2.6,], Plesk[Lin], Script[text/javascript], Title[Accueil ], X-Powered-By[PHP/5.2.6, PleskLin]
以下是我从Java获得的内容:
[1m[34mhttp://www.ceris-ingenierie.com[0m [200] [1m[37mApache[0m[[1m[32m2.2.9[0m], [1m[37mCookies[0m[[1m[33mca67a6ac78ebedd257fb0b4d64ce9388,jfcookie,jfcookie%5Blang%5D,lang[0m], [1m[37mCountry[0m[[1m[33mEUROPEAN UNION[0m][[1m[35mEU[0m], [1m[37mHTTPServer[0m[[1m[31mFedora Linux[0m][[1m[36mApache/2.2.9 (Fedora)[0m], [1m[37mIP[0m[[1m[33m185.13.64.116[0m], [1m[37mJoomla[0m[[1m[32m1.5[0m], [1m[37mMeta-Author[0m[[1m[33mAdministrator[0m], [1m[37mMetaGenerator[0m[[1m[33mJoomla! 1.5 - Open Source Content Management[0m], [1m[37mPHP[0m[[1m[32m5.2.6,[0m], [1m[37mPlesk[0m[[1m[33mLin[0m], [1m[37mScript[0m[[1m[33mtext/javascript[0m], [1m[37mTitle[0m[[32mAccueil [0m], [1m[37mX-Powered-By[0m[[1m[33mPHP/5.2.6, PleskLin[0m]
我的猜测是linux的shell中的颜色是由那些未知的字符生成的,但是在java中parsing真的很痛苦。
我通过在一个新的线程中运行脚本来获得这个输出,并且当我的输出中有一个新的行时,执行raw_data + = data;(其中raw_data是一个String),最后将raw_data发送到我的分析器。
我该怎么做,以避免得到那些恼人的字符,所以,得到一个更友好的输出,就像我在Linux的shell?
在您的Java代码中,执行shell script
,您可以添加一个额外的sed过滤器来过滤掉shell控制字符。
# filter out shell control characters ./my_script | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
使用tr -dc '[[:print:]]'
删除不可打印的字符,如下所示:
# filter out shell control characters ./my_script | \ sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | \ tr -dc '[[:print:]]'
您甚至可以在原始脚本的周围添加一个包装脚本来执行此操作。 并调用包装脚本。 这允许您在执行任何其他预处理之前,将其提供给Java程序并保持清除所有不必要的代码,并且可以专注于应用程序的核心逻辑。
如果因为任何原因无法添加包装器脚本,并且想要在Java中添加过滤器,则Java不直接在命令中支持管道。 你必须把你的命令作为参数来bash
这样的:
String[] cmd = { "/bin/sh", "-c", "./my_script | sed -r 's/\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g'" }; Process p = Runtime.getRuntime().exec(cmd);
当你在Java中使用正则表达式时,不要忘记逃避所有'\'
。
sed过滤器的来源和描述: http : //www.commandlinefu.com/commands/view/3584/remove-color-codes-special-characters-with-sed
你可以在这里使用正则表达式:
String raw_data= ...; String cleaned_raw_data = raw_data.replaceAll("\\[\\d+m", "");
这将删除以\\[
开始的任何字符序列,以m
结尾并且在它们之间具有一个或多个数字( \\d+
)。
请注意, [
之前是一个\\
因为[
对于正则表达式(这是一个元字符)有特殊的含义。