grep是如何工作的?

har*_*ari 15 c unix shell grep gnu

我试图了解它是如何grep工作的.

当我说grep "hello" *.*,确实grep得到2个参数 - (1)要搜索的字符串,即"你好"和(2)路径*.*?或者shell转换*.*grep可以理解的东西?

我在哪里可以获得源代码grep?我遇到了这个GNUgrep链接.其中一个README文件说它与...不同unix grep.怎么会这样?

我想看一下FreeBSD版本的源代码grep以及它的Linux版本(如果它们不同的话).

lus*_*oog 21

权力grep是自动机理论的神奇之处.GREP是Global Regular Expression Print的缩写.它的工作原理是构建一个自动机(一个非常简单的"虚拟机":不是图灵完成); 然后它"对输入流执行"自动机.

自动机是节点或状态的图形或网络.国家之间的过渡由受到审查的输入字符决定.特殊的机器人喜欢+*通过循环回归自己来工作.类似的字符类[a-z]由扇形表示:一个起始节点,每个字符分支到"辐条"; 并且通常辐条对单个最终状态具有特殊的"epsilon过渡",因此它可以与从正则表达式(搜索字符串)构建的下一个自动机相关联.epsilon转换允许状态的改变而不会在被搜索的字符串中向前移动.

编辑:看来我没有仔细阅读这个问题.

键入命令行时,它首先由shell预处理.shell执行别名替换和文件名通配.在替换别名(它们就像宏)之后,shell将命令行切换为参数列表(以空格分隔).此参数列表main()作为整数计数(通常称为argc)传递给可执行命令程序的函数,并指向(void *)0nul-terminated('\0')char数组的NULL 终止()数组.

个别命令会根据自己的意愿使用他们的参数.但是,如果给出-h参数,大多数Unix程序都会打印友好的帮助消息(因为它以减号开头,它被称为选项).GNU软件也将接受"长形式"选项--help.

由于不同版本的Unix程序之间存在很多差异,因此发现程序所需的确切语法的最可靠方法是询问程序本身.如果这不能告诉你你需要什么(或者它太难以理解),你应该接下来检查本地联机帮助页(man grep).对于gnu软件,您通常可以从中获取更多信息info grep.

  • 只是一个挑剔:GREP不是General Regular Expression Parser的缩写.它是vi/ex-mode命令`:g/re/p`的缩写,代表*global/regular expression/print*. (2认同)
  • @Jens:`grep`比`vi/ex`早一点; 它是模拟的`ed`命令`g/re/p`,在`vi`模式下被翻译成`:g/re/p`(在`ex中也是'g/re/p`) ).但要点是正确的. (2认同)

ick*_*fay 12

shell执行globbing(从*表单到文件名的转换).如果你有一个简单的C程序,你可以看到这个:

#include <stdio.h>

int main(int argc, char **argv) {
    for(int i=1; i<argc; i++) {
        printf("%s\n", argv[i]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样运行:

./print_args *
Run Code Online (Sandbox Code Playgroud)

你会看到它打印出匹配的内容,而不是*字面意思.如果你像这样调用它:

./print_args '*'
Run Code Online (Sandbox Code Playgroud)

你会看到它有文字*.

  • 从技术上讲,`echo*'足以证明这种情况. (4认同)

Jon*_*ler 6

shell将' *.*'扩展为文件名列表,并将扩展的文件名列表传递给程序,例如grep.该grep程序本身并不做文件名的扩展.

所以,在回答你的问题时:grep没有得到2个论点; shell将' *.*'转换为grep可以理解的东西.

GNU grep是从Unix不同的grep支持额外的选项,如-w-B-A.

在我看来FreeBSD使用GNU版本grep: