Nodejs进阶:readline实现日志分析+简易命令行工具

本文摘录自《Nodejs学习笔记》,更多章节及更新,请访问 github主页地址。欢迎加群交流,群号 197339705

模块概览

readline是个非常实用的模块。如名字所示,主要用来实现逐行读取,比如读取用户输入,或者读取文件内容。常见使用场景有下面几种,本文会逐一举例说明。本文相关代码可在笔者github上找到。

  • 文件逐行读取:比如说进行日志分析。
  • 自动完成:比如输入npm,自动提示"help init install"。
  • 命令行工具:比如npm init这种问答式的脚手架工具。

基础例子

先看个简单的例子,要求用户输入一个单词,然后自动转成大写

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.question('Please input a word: ', function(answer){
    console.log('You have entered {%s}', answer.toUpperCase());
    rl.close();
});

运行如下:

  toUpperCase git:(master)  node app.js
Please input a word: hello
You have entered {HELLO}

例子:文件逐行读取:日志分析

比如我们有如下日志文件access.log,我们想要提取“访问时间+访问地址”,借助readline可以很方便的完成日志分析的工作。

[2016-12-09 13:56:48.407] [INFO] access - ::ffff:127.0.0.1 - - "GET /oc/v/account/user.html HTTP/1.1" 200 213125 "http://www.example.com/oc/v/account/login.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36"
[2016-12-09 14:00:10.618] [INFO] access - ::ffff:127.0.0.1 - - "GET /oc/v/contract/underlying.html HTTP/1.1" 200 216376 "http://www.example.com/oc/v/account/user.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36"
[2016-12-09 14:00:34.200] [INFO] access - ::ffff:127.0.0.1 - - "GET /oc/v/contract/underlying.html HTTP/1.1" 200 216376 "http://www.example.com/oc/v/account/user.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36"

代码如下:

const readline = require('readline');
const fs = require('fs');

const rl = readline.createInterface({
    input: fs.createReadStream('./access.log')
});

rl.on('line', (line) => {
    const arr = line.split(' ');
    console.log('访问时间:%s %s,访问地址:%s', arr[0], arr[1], arr[13]);
});

运行结果如下:

  lineByLineFromFile git:(master)  node app.js
访问时间:[2016-12-09 13:56:48.407],访问地址:"http://www.example.com/oc/v/account/login.html"
访问时间:[2016-12-09 14:00:10.618],访问地址:"http://www.example.com/oc/v/account/user.html"
访问时间:[2016-12-09 14:00:34.200],访问地址:"http://www.example.com/oc/v/account/user.html"

例子:自动完成:代码提示

这里我们实现一个简单的自动完成功能,当用户输入npm时,按tab键,自动提示用户可选的子命令,如help、init、install。

  • 输入np,按下tab:自动补全为npm
  • 输入npm in,按下tab:自动提示可选子命令 init、install
  • 输入npm inst,按下tab:自动补全为 npm install
const readline = require('readline');
const fs = require('fs');

function completer(line) {
    const command = 'npm';
    const subCommands = ['help', 'init', 'install'];

    // 输入为空,或者为npm的一部分,则tab补全为npm
    if(line.length < command.length){
        return [command.indexOf(line) === 0 ? [command] : [], line];
    }

    // 输入 npm,tab提示 help init install
    // 输入 npm in,tab提示 init install
    let hits = subCommands.filter(function(subCommand){
        const lineTrippedCommand = line.replace(command, '').trim();
        return lineTrippedCommand && subCommand.indexOf( lineTrippedCommand ) === 0;
    })

    if(hits.length === 1){
        hits = hits.map(function(hit){
            return [command, hit].join(' ');
        });
    }

    return [hits.length ? hits : subCommands, line];
}

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  completer: completer
});

rl.prompt();

代码运行效果如下,当输入npm in,按下tab键,则会自动提示可选子命令init、install。

  autoComplete git:(master)  node app.js
> npm in
init     install

例子:命令行工具:npmt init

下面借助readline实现一个迷你版的npm init功能,运行脚本时,会依次要求用户输入name、version、author属性(其他略过)。

这里用到的是rl.question(msg, cbk)这个方法,它会在控制台输入一行提示,当用户完成输入,敲击回车,cbk就会被调用,并把用户输入作为参数传入。

const readline = require('readline');
const fs = require('fs');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: 'OHAI> '
});

const preHint = `
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See \`npm help json\` for definitive documentation on these fields
and exactly what they do.

Use \`npm install <pkg> --save\` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
`;

console.log(preHint);

// 问题
let questions = [ 'name', 'version', 'author'];

// 默认答案
let defaultAnswers = [ 'name', '1.0.0', 'none' ];

// 用户答案
let answers = [];
let index = 0;

function createPackageJson(){
    var map = {};
    questions.forEach(function(question, index){
        map[question] = answers[index];
    });

    fs.writeFileSync('./package.json', JSON.stringify(map, null, 4));
}

function runQuestionLoop() {

    if(index === questions.length) {
        createPackageJson();
        rl.close();
        return;
    }

    let defaultAnswer = defaultAnswers[index];
    let question = questions[index] + ': (' + defaultAnswer +') ';

    rl.question(question, function(answer){
        answers.push(answer || defaultAnswer);
        index++;
        runQuestionLoop();
    });
}

runQuestionLoop();

运行效果如下,最后还像模像样的生成了package.json(害羞脸)。

  commandLine git:(master)  node app.js

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.

name: (name) hello
version: (1.0.0) 0.0.1
author: (none) chyingp

写在后面

有不少基于readline的有趣的工具,比如各种脚手架工具。限于篇幅不展开,感兴趣的同学可以研究下。

相关链接

https://nodejs.org/api/readline.html

时间: 2024-08-22 07:47:37

Nodejs进阶:readline实现日志分析+简易命令行工具的相关文章

推荐给开发人员的实用命令行工具

作为一名Web开发者,当程序出现问题时日子总不是那么好过.问题可能无处不在,可能是你发送的请求出了错,可能是回复出了错,可能是你使用的某个第三方库出了问题,又或者是一个外部API调用失败了.优秀的工具对于定位问题出在何处有着无可估量的价值,而且能在一开始就帮助我们阻止问题的出现,总的来说能使我们的工作更有效率.命令行工具尤其有用,因为它们非常易于做自动化和脚本处理,能够以各种不同的方式进行组合和重用.本文介绍了6个非常强大且灵活的工具,熟练使用这些工具能使你的生活变得更轻松一些. Curl Cu

手把手教你利用命令行工具创建LinuxMac系统下的网站备份

创建网站备份应该是一个网站管理员最为重要的日常工作之一.但现实情况是,备份这一步往往被很多人忽略,也就是说仍然有很多网管的网站安全意识较低. 所有的Linux/Mac用户都能够零经济成本地通过命令行工具创建网站备份.如果你用的不是Linux/Mac,请关注我们的后续文章--如何在windows上通过软件方式创建备份. 本文的初衷不是为读者提供完整的备份解决方案,而是给那些有时间并且想要学习一些基础的命令行工具进行网站备份的宝宝们一点参考. 必要条件 你的主机必须具备必要的软件及证书. (1) 服

[MySQL]命令行工具和基本操作

原文:[MySQL]命令行工具和基本操作   一 MySQL命令行工具  (查看帮助 ---help,或 -?)   1)MySQL MySQL是一个简单的SQL外壳(有GNU readline功能).它支持交互式和非交互式使用.当交互使用时,查询结果采用ASCII表格式.当采用非交互式(例如,用作过滤器)模式时,结果为tab分割符格式.可以使用命令行选项更改输出格式.如果由于结果较大而内存不足遇到问题,使用--quick选项.这样可以强制MySQL从服务器每次一行搜索结果,而不是检索整个结果集

5个你可能会忽略的有用命令行工具

不可否认,好的命令行工具可给开发人员带来好处.这篇文章,正如标题所说的那样,将为大家介绍5款超棒的命令行工具. 1.Z 一次安装 甚至忘记了它 得益于它的生产力:Z. OK,但这是怎么一回事呢?好吧,Z可以让你快速从文件夹跳转到文件夹,而无需费心编写完整的绝对或相对路径.为了实现这一目标,它记录了所有你访问的文件夹,然后基于上次使用的频率和时间将它们排名.因此,所有你需要做的是键入 z part/of/path然后敲回车.通过这种方式,Z就会自动引导你到排名最高的匹配. 要安装Z,可以下载 z.

大数据、机器学习与深度学习类命令行工具汇总

抓紧你的键盘!无需鼠标或者GUI,我们完全能够在OS X与Linux上完成大量操作.面向各类*N*X系统的大量出色命令行工具一直在技术行业拥有极高人气,且已经扩展至Python.Go.NodeJS乃至各类混合型工具当中.即使大家并不打算通过命令行运行整条数据处理管道,这些工具仍然能够带来可观助益. <命令行上的数据科学(Data Science at the Command Line)>一书与GitHub皆为我们带来大量高水平的预处理与后处理类工具选项,大家亦可根据需要对其进行针对性调整.在今

7.0、Android Studio命令行工具

命令行工具分成SDK工具和平台工具. SDK工具 SDK工具跟随SDK安装包安装并随时更新. Virtual Device 工具 1. Android Virtual Device Manager 提供了一个图形化的图形用户接口,你可以创建和管理运行在Android虚拟机中的AVD. 2. Android Emulator 基于QEMU的设备虚拟机,允许你在实时的Android运行环境中调试和测试你的应用. 3. mksdcard 帮助你创建一个磁盘镜像 Development 工具 1. Hi

使用PhoneGap命令行工具创建IOS PhoneGap项目及无证书真机调试

       在使用PhoneGap2.0及以上版本的时候,发现无法像低版本那样直接使用xcode来创建一个新的项目,只能通过PhoneGap的命令行工具来进行创建.        准备工作:        首先,准备好mac的环境和xcode的安装,地球人都知道.        然后得确定你的xcode已安装了Command Line Tools,如果不会安装的可以直接百度,上面有很多教程,这里就不多说了.        接着,下载好最新版本(我使用的是phonegap-2.4.0,此教程用于

MongoDB 生态 - 官方命令行工具

工欲善其事,必先利其器,我们在使用数据库时,通常需要各种工具的支持来提高效率:很多新用户在刚接触 MongoDB 时,遇到的问题是『不知道有哪些现成的工具可以使用』,本系列文章将主要介绍 MongoDB 生态在工具.driver.可视化管理等方面的支持情况. 本文主要介绍 MongoDB 官方的命令行工具 Mongo shell MongoDB 的命令行管理工具,也是 MongoDB 最常用的工具,功能非常丰富,比如常用的 show dbs / show tables / show users

监控 Linux 系统的 7 个命令行工具

这里有一些基本的命令行工具,让你能更简单地探索和操作Linux. 深入 关于Linux最棒的一件事之一是你能深入操作系统,来探索它是如何工作的,并寻找机会来微调性能或诊断问题.这里有一些基本的命令行工具,让你能 更简单地探索和操作Linux.大多数的这些命令是在你的Linux系统中已经内建的,但假如它们没有的话,就用谷歌搜索命令名和你的发行版名吧,你会找 到哪些包需要安装(注意,一些命令是和其它命令捆绑起来打成一个包的,你所找的包可能写的是其它的名字).如果你知道一些你所使用的其它工具,欢迎评论