红联Linux门户
Linux帮助

通过Java实现Linux系统下grep指令的功能

发布时间:2016-12-12 09:56:49来源:linux网站作者:赵得C
在Linux系统下grep指令常见的使用方式有如下两种:
1.grep pattern files – 搜索 files 中匹配 pattern 的内容
2.grep -r pattern dir – 递归搜索 dir 中匹配 pattern 的内容
 
现有如下方法可实现在Windows系统下通过Java代码实现与第一种使用方法相同的功能:
 
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.nio.CharBuffer;  
import java.nio.MappedByteBuffer;  
import java.nio.channels.FileChannel;  
import java.nio.charset.Charset;  
import java.nio.charset.CharsetDecoder;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  
import java.util.regex.PatternSyntaxException;   
public class Grep { 
private static Charset charset = Charset.forName("utf-8");  
private static CharsetDecoder decoder = charset.newDecoder();
private static Pattern linePattern = Pattern.compile(".*\r?\n");  
private static Pattern pattern;
public static void main(String[] args) {  
if (args.length < 2) {  
System.err.println("Usage : java Grep pattern file...");  
return ;  
}  
compile(args[0]);  
for (int i = 1; i < args.length; i++) {  
File f = new File(args[i]);  
try {  
grep(f);  
} catch (IOException e) {  
System.err.println(f + ":" + e);  
}  
}  
private static void grep(File f) throws IOException {  
//取得 FileChannel  
FileInputStream fis = new FileInputStream(f);  
FileChannel fc = fis.getChannel();  
// Get the file's size and then map it into memory  
int size = (int) fc.size();  
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, size);  
//把 字节buffer decode 成 charBuffer  
CharBuffer cb = decoder.decode(bb);  
grep(f, cb);  
fc.close();  
}
private static void grep(File f, CharBuffer cb) {  
Matcher lm = linePattern.matcher(cb); //line matcher  
Matcher pm = null; //pattern matcher  
int lines = 0;  
while (lm.find()) {  
lines++;  
CharSequence curLineCs = lm.group();//the current line  
if (pm == null) {  
pm = pattern.matcher(curLineCs);  
} else {  
pm.reset(curLineCs);  
}  
if (pm.find()) {  
System.out.println(f + "→" + lines + ":" + curLineCs);  
}  
if (lm.end() == cb.limit()) { //文件最后  
break;  
}  
}  
}
private static void compile(String pat) {  
try {  
pattern = Pattern.compile(pat);  
} catch (PatternSyntaxException e) {  
System.err.println(e.getMessage());  
System.exit(1);  
}  
}  
}
 
执行java Grep abcd 1.txt 运行效果图如下:
通过Java实现Linux系统下grep指令的功能
 
也可以同时搜索多个文件,执行java Grep abcd 1.txt 2.txt 3.txt 4.txt 运行效果如下:
通过Java实现Linux系统下grep指令的功能
 
至此,在Windows系统下通过Java代码实现了与Linux系统写grep命令第一种使用方法相同的功能。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/26825.html