美文网首页
linux中wc是怎么实现的

linux中wc是怎么实现的

作者: HHMC | 来源:发表于2017-04-25 15:34 被阅读0次

    为什么会写这篇文章

    Unix中很多地方都涉及到文本处理,经常会涉及到 line , word , sentence , paragraph 等概念。而这里面就涉及到一些含义,但是这些含义好像是模糊不清的,所以写了这篇文章。

    wc中 line 和 character

    wc程序完成 line word character计数,但是什么是line,什么是character,什么又是word

    首先说 line 和 character:
    在stackoverflow中有这样一个问题:why should text files end with a newline?中有提到POSIX定义了line为

    A sequence of zero or more non- <newline> characters plus a terminating <newline> character.

    然后出现了一个有意思的现象
    所以在linux中touch 一个新文件,然后使用wc程序,显示 lines=0, characters=0;
    然后使用vi打开文件,使用 i 进入 insertmode,然后输入一个字符,然后 :wq,然后使用wc程序,显示lines=1 character=2。
    产生这个现象的原因就是文件末尾会自动添加一个newline character。

    wc 中 word :

    在Google中搜寻 wc source code,然后发现了两个比较有意思的搜索结果:

    1. https://www.gnu.org/software/cflow/manual/html_node/Source-of-wc-command.html#Source-of-wc-command
    2. http://code.metager.de/source/xref/gnu/coreutils/src/wc.c

    第一个是GNU cflow项目中的一个demo程序,比较简单,但是有点小遗憾,里面功能实现不全,而且使用gcc编译还有warning。
    第二个是看网页上xref可以知道在GNU CoreUtils网站中下载压缩包,然后在压缩包里面找到src/wc.c。

    先分析一下第一个中的代码

    ···
    int main (int argc, char **argv)
    {
    int i;
    if (argc < 2)
    errf ("usage: wc FILE [FILE...]");

    for (i = 1; i < argc; i++)
        counter (argv[i]);
    
    if (argc > 2)
        report ("total", total_ccount, total_wcount, total_lcount);
    return 0;
    

    }
    ···
    main中实现了主要功能,调用了数一个文件中有多少lines,words,characters的函数count

    然后比较关键的代码是getword函数,不停的从file stream中得到words
    其中COUNT完成lines和characters计数,getword函数完成words计数功能。

    这个代码对word计数与linux中wc计数不同,我认为主要原因是
    这段代码只将连续的字母作为一个字,连续的数字等不作为word
    isword用来判断当前字符是否处于一个字,isword实现的功能不完善

    再来分析第二个代码

    第二个代码相对就有700行之多,先挖个坑,以后学习点内核知识 再来填 coreutils的坑

    相关文章

      网友评论

          本文标题:linux中wc是怎么实现的

          本文链接:https://www.haomeiwen.com/subject/gzyvzttx.html