如何用Java或Linux命令检测分散在多行含十六进制文本中的指定SQL查询
检测分散在多行十六进制文本中的SQL语句
Linux命令解决方案
核心思路是先提取每行末尾的ASCII显示内容,拼接成完整字符串后再搜索目标SQL:
# 定义目标SQL的正则匹配式(替换空格为通配符适配显示中的点) TARGET_SQL="select.*from.*ignTestt1" # 提取ASCII内容、拼接、搜索 cat your_input_file.txt | awk '{print $NF}' | tr -d '\n' | grep -qi "$TARGET_SQL" && echo "目标SQL存在" || echo "目标SQL不存在"
命令说明
awk '{print $NF}':提取每行最后一列的ASCII显示区域(示例中每行末尾的16字符段)tr -d '\n':将所有行的ASCII内容拼接成单行字符串grep -qi "$TARGET_SQL":忽略大小写搜索目标正则,-q静默执行只返回状态码- 最后通过
&&/||输出结果
如果需要严格匹配空格(比如显示中空格未被替换为点),可以将正则调整为select[ .]*from[ .]*ignTestt1,匹配空格或点作为分隔符。
Java解决方案
通过读取文件每行内容,提取ASCII显示区域并拼接,再用正则匹配目标SQL:
import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class SqlChecker { public static void main(String[] args) throws Exception { if (args.length == 0) { System.err.println("请传入目标文件路径"); return; } List<String> lines = Files.readAllLines(Paths.get(args[0])); StringBuilder fullAscii = new StringBuilder(); for (String line : lines) { int lastSpacePos = line.lastIndexOf(' '); // 确保提取到有效的ASCII段 if (lastSpacePos != -1 && lastSpacePos < line.length() - 1) { fullAscii.append(line.substring(lastSpacePos + 1)); } } // 目标SQL正则,适配显示中的空格转点情况 String targetPattern = "select.*from.*ignTestt1"; boolean isFound = fullAscii.toString().matches(".*" + targetPattern + ".*"); System.out.println(isFound ? "目标SQL存在" : "目标SQL不存在"); } }
代码说明
- 读取目标文件所有行,遍历每行提取最后一个空格后的ASCII显示内容
- 将所有ASCII段拼接为完整字符串
- 使用正则表达式匹配目标SQL,
.*适配中间的点(原空格)或其他可能的分隔 - 输出检测结果
内容的提问来源于stack exchange,提问作者Chinmay Gogte
相关产品推荐
相关产品推荐

