grep查找文件名命令,grep查找指定文件内容

  grep查找文件名命令,grep查找指定文件内容

  来源:微信官方账号【编程明珠】

  作者:手表老师

  前言之前介绍过很多linux下搜索相关的命令,比如《Linux中的文件查找技巧》,《find命令高级用法》,《如何查看linux中文件打开情况》等。但是搜索文件内容的命令好像还没有涉及到,所以本文介绍了文本搜索命令——grep。

  常见用法我们经常将它与管道符号()结合使用,即在之前命令执行的结果中查找包含相关字符串的内容。例如:

  $ps-efgrepredis ps -ef用于检查系统进程的状态,但是它列出了很多结果。如果只是想看自己需要的,可以用grep来过滤搜索,比如搜索redis相关的进程。最后,它将只列出与redis相关的流程:

  $ PS-ef greprediscout 1075410733021:14 pts/2100:00:00 grep-color=auto redis那么如果想排除一些无关信息呢?我们可以使用-v参数。

  $ PS-ef grep Redis grep-vautoroot 1074810733021:14 pts/2100:00:00 Redis-server *:6379。这样,与auto相关的结果就不会出现在最终结果中。

  如果你只想统计结果的数量呢?我们可以结合使用-c(计数)参数:

  $ PS-EF grepradis-C2文件内容搜索已完成。说了最常见的用法,我们来看看如何搜索文件内容。其实awk和sed在这方面还是比较有经验的,但是本文的主角是grep,所以其他两个命令暂时不涉及。我们来看几个例子。

  在指定的文件中查找指定的关键字。

  例如,要在linux_command_debug.md文件中查找测试字符串:

  $ grep test AAA/BBB/Linux _ command _ debug . mdinttest(inta,intb)test(a,b);如果要显示指定关键字的行号,可以使用-n参数,例如:

  $ grep-n test AAA/BBB/Linux _ command _ debug . md18:int test(inta,intb)27:test(a,b);搜索时指定或排除多个文件。

  如前所述,搜索一个文件的内容,如果有多个文件呢?还是不想从某些文件中搜索?

  如果你想指定一个文件,你可以这样做,例如,搜索所有以md结尾的文件:

  $grep-ntest*。md或者您可以使用- exclude参数来排除一些文件,例如,查找包含test但排除txt的文件:

  $ grep-rn test-exclude=*。txt将忽略结尾的文件。搜索时txt。

  如果要排除许多条件,您可以将它们存储在另一个文件中:

  $ grep-rn test -exclude-from=skip . txt skip . txt的内容可以是模式匹配的文件名,也可以是特定的文件名:

  *.txttest.md这样,文件以。不会搜索. txt和test.md文件。

  此外,您还可以排除指定的目录,这需要- exclude-dir参数:

  $ grep-rn test-exclude-dir=aaa它会在搜索时跳过aaa目录中的文件。

  查找包含指定关键字的文件。

  如果要在当前目录的所有文件中查找包含字符串“int main(void)”的文件:

  $ grep-rn int main(void) AAA/BBB/c _ main _ func . MD:49:int main(void)AAA/BBB/c _ main _ func . MD:71:int main(void){/*.*/} AAA/BBB/c _ array . MD:104:int main(void)AAA/BBB/c _ array . MD:129:int main(void)AAA/BBB/PC-lint . MD:42:int main(void)AAA/BBB/PC-lint . MD:128:int main(void)这可能是最实用的使用方法之一了.这里-r参数表示递归搜索当前目录中的文件,-n将显示搜索位置的行号。如果只想显示包含指定关键字的文件名,可以使用-l(--file-with-matches)参数:

  $ grep-rln int main(void) AAA/BBB/C _ main _ func.mdaaa/BBB/C _ array.mdaaa/BBB/PC-lint.md如果你尝试一下,你会发现如果你不取-r参数,它会暂停,等待你从控制台输入,例如:

  $grep-ntesttest1:test所以使用时记得带上相关参数!

  查找不包含指定关键字的文件。

  我前面提到了如何找到带有某个关键字的文件。如果你在找一个关键字为不包含的文件怎么办?

  实际上,只需使用-L参数:

  $grep-rLnintmain(void)(不包含指定关键字内容的文件名将显示在此处)搜索时忽略大小写。

  使用-I(-I(--ignore-case)参数:

  $ grep-rni int main(void) AAA/BBB/c _ main _ func . MD:49:int main(void)AAA/BBB/c _ main _ func . MD:71:int main(void){/*.*/} AAA/BBB/C _ array . MD:104:int main(void)AAA/BBB/C _ array . MD:129:int main(void)AAA/BBB/PC-lint . MD:42:int main(void)AAA/BBB/PC-lint . MD:128:int main(void)Search显示不包含指定关键字的行。

  前面的大多数示例都显示合格的行。想显示不合格的行怎么办?您可以使用我们前面提到的-v参数:

  $grep-rnvintmain(void)(更多内容,未显示)将从结果中找到。它将显示带有指定关键字的文件,但不显示带有关键字的行。

  显示指定关键字的上下文。

  如果需要查看包含指定关键字的行附近的行,没有办法按照前面的方式查看,但是我们可以使用-a (-A( - after-context==)和-b (-B( - before-context==)参数来显示前后的行:

  $ grep-rn int main(void)-A1-B1AAA/BBB/C _ array . MD-103-} AAA/BBB/C _ array . MD:104:int main(void)AAA/BBB/C _ array . MD-105-{

  指定要搜索的规则文件。

  有多个搜索关键词怎么办?我们可以将关键字写在一个文件中,并在搜索时指定该文件。例如,规则文件是key.txt:

  Int (void) test从指定文件中搜索上述关键字:

  $catfilenamegrep-fkey.txt这样的话,结果会显示出匹配key.txt文件中所有关键字的行,非常适合多条件搜索。

  正则表达式搜索

  看了前面的内容,你还没有感受到grep的强大吗?grep的另一个强大之处是它搜索支持正则表达式,比如查找文本行以T开头以T结尾的文件:

  $ egrep-rn t . * t $ AAA/BBB/c _ operate _ redis _ start . MD:68:typedefstructstu _ info _ struct AAA/BBB/c _ operate _ redis _ start . MD:101:typedefstructstu _ info _ struct其中关于正则表达式的编写,本文就不详细介绍了。

  在总结内容搜索中,grep往往可以帮助我们,所以掌握grep的使用也是linux学习中不可或缺的一部分。当然,我们不需要完全记住每个参数的作用,但我们至少知道有这样的参数,需要的时候可以快速找到。本文中常用的参数如下:

  关注微信官方账号【编程明珠】,获取更多Linux/C/C/Python/Go/algorithms/tools等原创技术文章。后台免费获取经典电子书和视频资源。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: