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); } } } }
相关推荐
本话题聚焦于如何使用Java编程语言来实现`grep`的功能。让我们深入探讨这个过程,以及Java如何为这个任务提供支持。 首先,理解`grep`的基本原理至关重要。`grep`命令接受一个或多个模式(通常是正则表达式),然后...
这个Java实现的Shell包含了诸多常见命令,如`pwd`用于显示当前工作目录,`cd`用于切换目录,`ls`列出目录内容,`cat`查看文件内容,`echo`打印文本,`head`和`tail`分别用于显示文件的前几行和后几行,`grep`进行...
不过,Windows CMD并没有内置这个功能,但我们可以借助第三方工具来实现类似的效果。在提供的资源中,包含了一个名为`tail.exe`的可执行文件,这正是一个适用于Windows的`tail`命令模拟工具。 `tail`命令的主要功能...
理解正则表达式的语法和Java中的匹配、查找、替换方法对于实现这些功能至关重要。 5. **文件权限与访问控制** Unix系统的文件权限模型对编程有很大影响。在Java中,我们可以使用`java.nio.file`包的`Files`类来...
在Java中,这些功能可以通过`ProcessBuilder`类模拟实现。 5. **Java中的文件操作库**: Java标准库提供了丰富的API来进行文件操作,如`java.nio.file`包中的`Path`, `Files`, `FileVisitor`等接口和类,它们提供...
分析.log文件通常需要专门的工具或编程语言,例如使用grep、awk、sed等Linux命令行工具,或者通过Python、Java、R等编程语言编写脚本。这些工具可以帮助我们提取特定信息,如查找特定IP的访问记录、统计404错误、...
`grep`用于搜索文本,`lsof`显示进程打开的文件,`mkdir`创建目录,`rm`删除文件,`tail`查看文件尾部,`whereis`定位命令位置,`pwd`显示当前工作目录,`tar`、`gzip`、`unzip`分别用于归档、压缩和解压缩文件,`...
- **命令组合使用**: 通过组合不同的Arthas命令,可以实现更复杂的诊断逻辑,例如`watch`配合`grep`可以过滤特定条件的结果。 - **命令别名**: 可以自定义命令别名,简化常用命令的输入。 - **在线文档**: Arthas...
9. **自动化测试**:利用工具如Selenium、Junit、TestNG进行自动化测试,可以编写脚本模拟用户操作,实现对Web应用的批量和持续测试。 10. **版本控制**:在源码管理方面,Git是广泛使用的版本控制系统。通过Git,...
为了在Windows上运行,我们需要安装Cygwin或者Git Bash这样的模拟Linux环境,它们提供了这些命令行工具的实现。此外,Hadoop的启动脚本通常使用Linux的路径表示法(/),在Windows中需要转换为Windows的路径表示法...
通过执行`ssh-keygen`命令生成密钥对,然后将公钥追加到authorized_keys文件中,即可实现SSH免密登录。 【Hadoop的下载与安装】 从官方网站或镜像站点下载Hadoop的tarball文件,例如Hadoop 2.6.0。解压缩文件,并...
其中,Java线程转储Grep (jtdgrep) 是Genba Tools for Java中的一个重要组成部分。线程转储是Java应用程序在特定时刻所有线程的状态快照,这对于诊断多线程问题、死锁和资源争用等问题至关重要。jtdgrep工具设计简洁...
此外,`chown`用于改变文件的所有者,`find`用于查找特定文件,`tar`用于文件的压缩和解压缩,`grep`则用于搜索文件中的特定字符串。 在Hadoop部分,实验介绍了如何在Linux环境下安装和配置Hadoop。首先,需要创建...
在提供的文件列表中,我们看到几个与单元测试和模拟有关的库文件: - **dbunit-2.2.jar**:DBUnit是一个用于数据库单元测试的Java框架,它允许开发者在测试前后加载和验证数据库的状态。 - **easymock.jar**:...
Java的丰富的类库和强大的API也为实现复杂的终端功能提供了便利。 2. **类Unix终端模拟** 类Unix终端通常指的是具有类似Unix shell特性的终端模拟器,如命令行输入、进程控制、管道、重定向等。`jix-terminal`旨在...
例如,使用命令行工具(如Windows的`find`或Linux的`grep`)可以快速在大量文本文件中查找特定字符串。 7. **版本控制**:在版本控制系统(如Git)中,TXT文件因其轻量级和文本可比性,被广泛用于源代码和其他文本...