java调用awk命令----判断txt中是否只有数字

最近项目中遇到一个问题:用户在上传文档的时候,没有按照规定的要求上传(txt中只允许有数字,每一行是一个序列码),影响了功能使用。基于此给出了两种解决方案
1、忽略非数字的序列码,只执行正常的序列码,执行成功后给出提示。
2、上传文件的时候进行校验,不符合规则的txt不允许上传。

方案一
缺点:用户体验不好,在用户未允许的情况下部分执行部分不执行,需要用户2次修改失败的序列码重新执行
优点:修改现有代码,修改速度快。
方案二
缺点:多加一层校验,需要解决校验的效率(如果txt文件很大的话),减少用户的等待时间
优点:用户体验好一些,由用户决定如何处理不符合规范的文本
做为一家互联网公司巨头,用户体验是至高无上的,故采用方案2解决。

项目是用java语言写的,跑在linux机器下,如何才能高效的解决校验问题呢?

目前想到的方案是用jvm虚拟机调用awk命令去处理,至于效率如何还有待遇测试后续给出结论,大神们如果有什么好的方案欢迎在下面留言指导哈,本文重点在说明如何使用Java调用shell命令。
直接上代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
* @param
* @author jerry
* @description java调用shell脚本
* @date 2018-08-17
**/
public class ShellTest {
public static void main(String args[]) throws InterruptedException {
Process process = null;
List processList = new ArrayList();
try {
String[] command = new String[] { “/bin/sh”, “-c”, “awk ‘!/^[0-9]+/{print \"第\"NR\"行: \" /{print \"第\"NR\"行: \" 0 }’ /Users/jerry/work/test.txt” };
process = Runtime.getRuntime().exec(command);
int exitValue = process.waitFor();
System.out.println(exitValue);//返回0表示脚本之行成功
//将不符合要求的行号和内容一并输出
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = “”;
while ((line = input.readLine()) != null) {
processList.add(line);
}
input.close();
} catch (IOException e) {
e.printStackTrace();
}
for (String line : processList) {
System.out.println(line);
}
}
上面几行代码就搞定了。

String[] command = new String[] { "/bin/sh", "-c", "awk '!/^[0-9]+$/{print \"第\"NR\"行: \" $0 }' /Users/jerry/work/test.txt" };

这行代码没显示全,估计是和markdown编辑器转义字符有冲突,我也懒得去调了,请参照如下截图
这里写图片描述
这里存放的是执行的awk命令,其中/bin/sh 参数是解析器用的是sh,其中-c原文解释如下:
If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with 0.c 0. 如 果 − c 选 项 存 在 , 读 取 字 符 串 中 的 命 令 , 如 果 字 符 串 后 有 参 数 , 从 0开始替换参数

awk '!/^[0-9]+$/{print \"第\"NR\"行: \" $0 }' /Users/jerry/work/test.txt

这里是按行读取文件并输出含有非数字的行数和行内容

process = Runtime.getRuntime().exec(command);
            int exitValue = process.waitFor();

这里是调用jvm的Runtime中的exec执行linux命令,process.waitFor()若返回时0说明命令执行成功,返回其他数字表示命令执行失败

如下为测试结果:
1、test.txt内容中只有数字
java调用awk命令----判断txt中是否只有数字_第1张图片
运行结果输出为空
这里写图片描述
2、test.txt中含有非数字
java调用awk命令----判断txt中是否只有数字_第2张图片
输出结果如下:
java调用awk命令----判断txt中是否只有数字_第3张图片

效果还是不错的,先根据exitValue判断命令是否成功,再根据返回是否为null判断是否含有非法字符

如果你有其他好建议,欢迎在下方留言

你可能感兴趣的:(java,linux)