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 就干等着,无所事事。(其实它是在等待着你从键盘输入。)当你要搜索大量数据,预计会花费很长时间时,很难分辨出这种尴尬的情况。
酷客网相关文章:
评论前必须登录!
注册