Bash Shell文件中查找字符串

Bash Shell文件中查找字符串,你需要在一个或多个文件中查找所有出现过的某个字符串

解决方案

grep 命令可以搜索文件,查找指定的字符串。

$ grep printf *.c
both.c:    printf("Std Out message.\n", argv[0], argc-1);
both.c:    fprintf(stderr, "Std Error message.\n", argv[0], argc-1);
good.c:    printf("%s: %d args.\n", argv[0], argc-1);
somio.c:        // we'll use printf to tell us what we
somio.c:        printf("open: fd=%d\n", iod[i]);
$

在这个例子中,我们搜索的文件全都位于当前目录下。因此,我们只使用了简单的 shell 模式 *.c 来匹配以 .c 结束的文件,并没有在文件名前再添加路径。

但并非所有待搜索的文件都老老实实地待在当前目录下。但因为 shell 并不在意你输入多少路径名,所以我们也可以这么写:

grep printf ../lib/*.c ../server/*.c ../cmd/*.c */*.c

讨论

如果待搜索的文件不止一个,grep 会在输出前加上文件名以及冒号,然后是该文件中包含 grep 搜索内容的文本。

搜索会匹配指定的字符串,所以含有“fprintf”的行会被返回,因为“fprintf”包含“printf”。

grep 的第一个(非选项)参数可以是一个简单的字符串,正如本例中所示,也可以是更复杂的正则表达式(regexp)。正则表达式不同于 shell 的模式匹配,尽管两者有时看起来差不多。模式匹配的功能无比强大,你可能会发现自己对其的依赖已经到了开始将“grep”作为动词的程度,只想随时随地都能用到它,比如“希望能在我的书桌上 grep 到你想要的论文”。

你可以用命令行选项控制 grep 的输出形式。如果不想看到特定文件名,指定 -h 选项即可。

$ grep -h printf *.c
  printf("Std Out message.\n", argv[0], argc-1);
  fprintf(stderr, "Std Error message.\n", argv[0], argc-1);
  printf("%s: %d args.\n", argv[0], argc-1);
      // we'll use printf to tell us what we
      printf("open: fd=%d\n", iod[i]);
$

如果不想看到文件中包含指定字符串的那些行,只想知道匹配到了几次,可以使用 -c 选项。

$ grep -c printf *.c
both.c:2
good.c:1
somio.c:2
$

常见的错误是忘记指定 grep 的输入,例如 grep myvar。这种情况下,grep 会认为你要从 STDIN 提供输入,而你以为它会读取文件,于是 grep 就干等着,无所事事。(其实它是在等待着你从键盘输入。)当你要搜索大量数据,预计会花费很长时间时,很难分辨出这种尴尬的情况。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!