`

Java模拟实现grep文件的功能

 
阅读更多
import java.io.File;
import java.io.FileInputStream;
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 {
 
     // Charset and decoder for ISO-8859-15
     private static Charset charset = Charset.forName("ISO-8859-15");
     private static CharsetDecoder decoder = charset.newDecoder();
 
     // Pattern used to parse lines
     private static Pattern linePattern = Pattern.compile(".*\r?\n");
 
     // The input pattern that we're looking for
     private static Pattern pattern;
 
     // Compile the pattern from the command line
     private static void compile(String pat) {
         try {
             pattern = Pattern.compile(pat);
         } catch (PatternSyntaxException x) {
             System.err.println(x.getMessage());
             System.exit(1);
         }
     }
 
     // Use the linePattern to break the given CharBuffer into lines, applying
     // the input pattern to each line to see if we have a match
     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 cs = lm.group();      // The current line
             if (pm == null)
                 pm = pattern.matcher(cs);
             else
                 pm.reset(cs);
             if (pm.find())
                 System.out.print(f + ":" + lines + ":" + cs);
             if (lm.end() == cb.limit())
                 break;
         }
     }
 
     // Search for occurrences of the input pattern in the given file
     private static void grep(File f) throws IOException {
 
         // Open the file and then get a channel from the stream
         FileInputStream fis = new FileInputStream(f);
         FileChannel fc = fis.getChannel();
 
         // Get the file's size and then map it into memory
         int sz = (int)fc.size();
         MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);
 
         // Decode the file into a char buffer
         CharBuffer cb = decoder.decode(bb);
 
         // Perform the search
         grep(f, cb);
 
         // Close the channel and the stream
         fc.close();
     }
 
     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 x) {
                 System.err.println(f + ": " + x);
             }
         }
     }
 }

 

分享到:
评论

相关推荐

    Grep:使用Java实现Grep功能

    本话题聚焦于如何使用Java编程语言来实现`grep`的功能。让我们深入探讨这个过程,以及Java如何为这个任务提供支持。 首先,理解`grep`的基本原理至关重要。`grep`命令接受一个或多个模式(通常是正则表达式),然后...

    用java 编写的 linux 中的 shell 源代码

    这个Java实现的Shell包含了诸多常见命令,如`pwd`用于显示当前工作目录,`cd`用于切换目录,`ls`列出目录内容,`cat`查看文件内容,`echo`打印文本,`head`和`tail`分别用于显示文件的前几行和后几行,`grep`进行...

    在window是cmd下实现动态查看日志

    不过,Windows CMD并没有内置这个功能,但我们可以借助第三方工具来实现类似的效果。在提供的资源中,包含了一个名为`tail.exe`的可执行文件,这正是一个适用于Windows的`tail`命令模拟工具。 `tail`命令的主要功能...

    LearningProjects:用Java实现的经典Unix实用程序

    理解正则表达式的语法和Java中的匹配、查找、替换方法对于实现这些功能至关重要。 5. **文件权限与访问控制** Unix系统的文件权限模型对编程有很大影响。在Java中,我们可以使用`java.nio.file`包的`Files`类来...

    命令行管理器

    在Java中,这些功能可以通过`ProcessBuilder`类模拟实现。 5. **Java中的文件操作库**: Java标准库提供了丰富的API来进行文件操作,如`java.nio.file`包中的`Path`, `Files`, `FileVisitor`等接口和类,它们提供...

    网站日志 .log文件

    分析.log文件通常需要专门的工具或编程语言,例如使用grep、awk、sed等Linux命令行工具,或者通过Python、Java、R等编程语言编写脚本。这些工具可以帮助我们提取特定信息,如查找特定IP的访问记录、统计404错误、...

    java面试题总汇(计算机基础、网络、存储、缓存、分布式、安全)

    `grep`用于搜索文本,`lsof`显示进程打开的文件,`mkdir`创建目录,`rm`删除文件,`tail`查看文件尾部,`whereis`定位命令位置,`pwd`显示当前工作目录,`tar`、`gzip`、`unzip`分别用于归档、压缩和解压缩文件,`...

    arthas安装部署文件

    - **命令组合使用**: 通过组合不同的Arthas命令,可以实现更复杂的诊断逻辑,例如`watch`配合`grep`可以过滤特定条件的结果。 - **命令别名**: 可以自定义命令别名,简化常用命令的输入。 - **在线文档**: Arthas...

    linux 测试程序..

    9. **自动化测试**:利用工具如Selenium、Junit、TestNG进行自动化测试,可以编写脚本模拟用户操作,实现对Web应用的批量和持续测试。 10. **版本控制**:在源码管理方面,Git是广泛使用的版本控制系统。通过Git,...

    hadoop2.7.1的Windows版本

    为了在Windows上运行,我们需要安装Cygwin或者Git Bash这样的模拟Linux环境,它们提供了这些命令行工具的实现。此外,Hadoop的启动脚本通常使用Linux的路径表示法(/),在Windows中需要转换为Windows的路径表示法...

    实验一 hadoop 安装配置.docx

    通过执行`ssh-keygen`命令生成密钥对,然后将公钥追加到authorized_keys文件中,即可实现SSH免密登录。 【Hadoop的下载与安装】 从官方网站或镜像站点下载Hadoop的tarball文件,例如Hadoop 2.6.0。解压缩文件,并...

    Genba Tools for Java-开源

    其中,Java线程转储Grep (jtdgrep) 是Genba Tools for Java中的一个重要组成部分。线程转储是Java应用程序在特定时刻所有线程的状态快照,这对于诊断多线程问题、死锁和资源争用等问题至关重要。jtdgrep工具设计简洁...

    数据科学导论实验报告 实验1:常用Linux操作和 Hadoop操作

    此外,`chown`用于改变文件的所有者,`find`用于查找特定文件,`tar`用于文件的压缩和解压缩,`grep`则用于搜索文件中的特定字符串。 在Hadoop部分,实验介绍了如何在Linux环境下安装和配置Hadoop。首先,需要创建...

    Shell kill tomcat process

    在提供的文件列表中,我们看到几个与单元测试和模拟有关的库文件: - **dbunit-2.2.jar**:DBUnit是一个用于数据库单元测试的Java框架,它允许开发者在测试前后加载和验证数据库的状态。 - **easymock.jar**:...

    jix-terminal:用Java编写的类Unix跨平台终端

    Java的丰富的类库和强大的API也为实现复杂的终端功能提供了便利。 2. **类Unix终端模拟** 类Unix终端通常指的是具有类似Unix shell特性的终端模拟器,如命令行输入、进程控制、管道、重定向等。`jix-terminal`旨在...

    文本文档Txt

    例如,使用命令行工具(如Windows的`find`或Linux的`grep`)可以快速在大量文本文件中查找特定字符串。 7. **版本控制**:在版本控制系统(如Git)中,TXT文件因其轻量级和文本可比性,被广泛用于源代码和其他文本...

Global site tag (gtag.js) - Google Analytics