繁体   English   中英

从String中删除Shell Controll和不可打印的字符(Linux输出)

[英]remove shell controll and non-printable characters from String (linux output)

在Web扫描仪应用程序中,我需要解析一些脚本的输出以获取一些信息,但是问题是我在linux shell和java输出中没有得到相同的输出,让我对其进行描述(此示例通过whatweb完成在我需要在工作中扫描的网站之一上,但是每当我在shell中有彩色输出时,我也会遇到此问题):

这是我从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外壳中的颜色是由那些未知字符生成的,但是对于使用Java解析它们确实是一种痛苦。

通过在新线程中运行脚本并在每当输出中有新行时执行raw_data + = data;(其中raw_data是字符串)来获得此输出,以最终将raw_data发送到解析器。

我该如何避免得到那些烦人的字符等等,以获得更友好的输出,就像我进入linux的shell一样?

在执行shell script的Java代码中,可以添加一个额外的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+ )的字符序列。

请注意[前面带有\\\\因为[对于正则表达式具有特殊含义(它是一个元字符)。

描述

正则表达式可视化

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM