脚本移植性的问题和解决思路
来源:互联网 发布:java style标签 编辑:程序博客网 时间:2024/05/29 17:39
昨天遇到一个问题,某台Jenkins服务从Mac移植到Windows,不得不把之前的shell脚本用bat实现,回想以前也遇到过这种情况
- 代码中调用脚本;
- Job中调用脚本。
文件操作是比较常用的场景,以前用对于的增、删、改、查的实现比较多,在此基础上可以再丰富些功能,那么想法转化成行动吧
需求点
- 用代码实现grep,awk,sed等的部分功能,做成插件,可用于日志的过滤、查询、文件数据的查询、统计等,以替代依赖于平台的脚本,提高移植性;
- 支持对文件的操作,也支持对已存在于内存的字符串进行操作,分为过滤和查询统计两大功能;
- 作为一个插件,可扩展性要高。
设计和解决思路
- 设计过滤、查询统计两个接口,使用泛型(规范和扩展);
- 文件操作和字符串操作实现这两个接口;
部分实现类代码
/** * 设置筛选内容,过滤出包含筛选内容的行 * @param fname 文件路径 * @param filter * @return 包含筛选内容的所有行 */ public String grep(String fname, String filter) { String find = ""; String line; try { inputStream = new FileInputStream(fname); encode = EncodingDetect.getJavaEncode(fname); sc = new Scanner(inputStream, encode); while (sc.hasNextLine()) { line = sc.nextLine(); if (line.contains(filter)) find = find + line + System.getProperty("line.separator"); } } catch (FileNotFoundException e) { find = ""; e.printStackTrace(); } finally { try { if (inputStream != null) { inputStream.close(); } if (sc != null) { sc.close(); } } catch (IOException e) { find = ""; e.printStackTrace(); } } return find.trim(); } /** * 从文件末尾开始,按指定行数输出 * @param fileName 文件路径 * @param lines 行数 * @return 符合条件的行 */ public String tail(String fileName, int lines) { boolean findFirstNonBlankLine = false; String line; String content = ""; RandomAccessFile rf = null; try { rf = new RandomAccessFile(fileName, "r"); long len = rf.length(); long start = rf.getFilePointer(); long nextend = start + len - 1; rf.seek(nextend); int c = -1; while (nextend > start) { c = rf.read(); if (c == '\n' || c == '\r') { line = rf.readLine(); if (lines > 0) { if (null == line || line.trim().isEmpty()) { if (findFirstNonBlankLine) { content = line + System.getProperty("line.separator") + content; lines--; } else { continue; } } else { content = line + System.getProperty("line.separator") + content; findFirstNonBlankLine = true; lines--; } } nextend--; } nextend--; if (lines == 0) break; rf.seek(nextend); // 当文件指针退至文件开始处,输出第一行 if (nextend == 0) { line = rf.readLine(); content = line + System.getProperty("line.separator") + content; break; } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (rf != null) { rf.close(); } } catch (IOException e) { e.printStackTrace(); } } return content.trim(); } /** * 文件查询,按指定列指定条件查询 * @param from 文件路径 * @param where 查询条件的列标 * @param condition 查询条件 * @param column 查询的字段 * @return 符合条件的查询结果 */ public List<List<String>> select(String from, int where, String condition, int... column) { String line; String[] columnOfLine; List<String> unitList = null; List<List<String>> selectList = new ArrayList<List<String>>(); try { inputStream = new FileInputStream(from); encode = EncodingDetect.getJavaEncode(from); sc = new Scanner(inputStream, encode); while (sc.hasNextLine()) { line = sc.nextLine(); line = line.trim().replaceAll(" +", " ").replaceAll("\t+", " "); if (line.isEmpty()) { continue; } unitList = new ArrayList<String>(); columnOfLine = line.split(" "); if (columnOfLine[where - 1].trim().equals(condition)) { if (null != column && column.length > 0) { for (int i = 0; i < column.length; i++) { unitList.add(columnOfLine[column[i] - 1].trim()); } } else { for (int i = 0; i < columnOfLine.length; i++) { unitList.add(columnOfLine[i].trim()); } } selectList.add(unitList); } } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { if (inputStream != null) { inputStream.close(); } if (sc != null) { sc.close(); } } catch (IOException e) { e.printStackTrace(); } } return selectList; }
作为一个插件,虽然还不够完善,但至少解决了我目前的需求。日常工作中,总会遇到这样那样的问题,如能总结经验教训,转化成有用的东西,何乐而不为,希望对大家有帮助。
0 0
- 脚本移植性的问题和解决思路
- 考勤问题思路和解决
- Redis主从复制问题和扩容问题的解决思路
- Redis主从复制问题和扩容问题的解决思路
- 解决一个错误封禁的问题的过程和思路
- 解决复杂问题的思路
- 线上问题的解决思路
- 八皇后问题,解决思路和代码
- 移植的一种思路
- 解决i18n的问题有三种经典思路
- ajax页面刷新问题的解决思路
- 粘包问题的解决思路
- Lowest Common Ancestor问题的解决思路
- 解决执行力问题的思路
- 解决执行力问题的思路
- 解决执行力问题的思路
- 解决技术问题的通用思路
- listview重载问题的解决思路
- 嵌入式Linux开发学习笔记:编译与调试
- JavaScript判断浏览器类型及版本
- Centos6.5 64+oracle11.2.0.4+rman 搭建物理DG
- Unity之计算环境反射WorldRefl
- 51Nod 1268 和为K的组合(搜索/+回溯)
- 脚本移植性的问题和解决思路
- 欢迎使用CSDN-markdown编辑器
- 【Visual Studio】编译项目报错:无法打开包括文件:“*.h”: No such file or directory
- The Schröder-Bernstein Theorem
- 位运算
- c++知识点
- 递归求幂
- 平衡二叉树
- linux常用命令